B 国际跳棋
文件名 输入文件 输出文件 时间限制 空间限制
chess.cpp/c/pas chess.in chess.out 1s 512MB

题目描述
国际跳棋是一种古老的棋类游戏,远在古埃及法老时期就已存在,现代国际跳
棋是在 12 世纪定型的。国际跳棋是由各国的民族跳棋演变而来,其历史源远流长。
简化版(与标准国际跳棋略有差别)国际跳棋规则:
• 国际跳棋的棋盘由 10 × 10 共 100 个格子组成
• 初始的时候,黑白双方各有 20 个棋子
• 移动:可以将我方任意棋子向左前方或右前方移动 1 步
• 跳吃:只要左前方、右前方、左后方、右后方相邻格子有对方棋子,且跳过这
枚对方棋子后有空位,则可以跳过对方棋子并将对方棋子吃掉。如你的棋子在
(x,y), 对方棋子在 (x+1,y+1), (x+2,y+2) 为空, 则你可以跳到 (x+2,y+2)
并吃掉对方的棋子
• 加冕: 任何一个棋子在行动过程停止的时候停到了对方底线(最靠近对方的一
行)就可以加冕,从此成为“王”。注意,连续跳吃的时候只有最后一步停在对
方底线才可以加冕
• 连跳:跳吃可以由多次跳吃组成。
• 王的特权:王在移动的时候可以无视方向(左前、右前、左后、右后都可以) ,
无视距离(走几步都行, 直到遇到别的棋子) , 无视跳吃距离(比如说 (x,y) 跳
过 (x + 3,y + 3) 落到 (x + 7,y + 7) 是可以的,但是这中间除了有被吃掉的对
方棋子,不能有其他棋子
• 在跳吃结束的时候才将被吃掉的棋子拿出棋盘,在这之前作为“屏障”,即这些
棋子不能再次被跳吃,也不能落子
• 按照以上规则,给定一个棋局,合法的操作方案有很多。然而,每次必须选择
吃子最多的操作方案。比如,在某种棋局下,有 A、B、C、D 四种方案,A、
B 吃子 3 枚,C 吃 1 枚,D 吃 0 枚,则真正合法的操作总数为 2
作为一个国际跳棋迷,陶陶想要编写一个网络对战跳棋软件。然而他现在不会
判断怎样的操作是合法的。对于给定的局面,你能给出所有合法的操作吗?

输入格式
输入数据是两个十行十列的矩阵,第一个矩阵中的每个点可能是以下三种:
• 0 空位置
• 1 我方棋子
• 2 对方棋子
第二个矩阵描述的是国王的情况。若为 1,表示是国王;为 0 表示不是国王。
输出格式
输出第一行为一个数字,表示合法操作的个数 ans。
下面一共 ans 行,每行表示一种合法操作中被操作的棋子。格式为 (x,y) 表示
该棋子在第 x 行、第 y 列(注意,逗号后面没有空格) 。如果某一个棋子有多种合
法操作,则输出多遍。输出的顺序按从上到下、从左到右。
如果没有任何合法操作,只输出一个 0 即可

样例输入 1
0000000000
0000100000
0000000200
0000100000
0000000200
0000001000
0000000200
2000000000
0101000200
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
5
0000000000
0000000000
0000000000
0000000000

样例输出 1
2
(6,7)
(6,7)

读题很重要,读懂了差不多就会了

gty:“这道题目的难点不在搜索也不在剪枝,在读题和实现”

考试时没有读懂题。

那么我在这里先强调一下:这道题加冕什么的鬼东西都没有用;我们求的方案是操作的棋子只跳一步(连跳算一步)。

就是简(ma)单(fan)的搜索。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdlib>
using namespace std;
int King[15][15],map[15][15];
int wx[100009],wy[100009],cnt;
int maxn;//表示吃掉的最大个数
bool die[15][15];
int dx[]={1,1,-1,-1},dy[]={1,-1,1,-1};
void dfs1(int x,int y,int num,int sx,int sy)
{if(num>=maxn){if(num>maxn) maxn=num,cnt=0;wx[++cnt]=sx;wy[cnt]=sy;}for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(map[xx][yy]==2&&(!die[xx][yy])&&map[xx+dx[i]][yy+dy[i]]==0&&xx+dx[i]<=10&&xx+dx[i]>=1&&yy+dy[i]>=1&&yy+dy[i]<=10)die[xx][yy]=1,dfs1(xx+dx[i],yy+dy[i],num+1,sx,sy),die[xx][yy]=0; }
}
void dfs2(int x,int y,int num,int sx,int sy)
{if(num>=maxn){if(num>maxn) maxn=num,cnt=0;wx[++cnt]=sx;wy[cnt]=sy;}int xx,yy,XX,YY;for(xx=x+1,yy=y+1;xx<=10&&yy<=10;xx++,yy++)//右下 {if(map[xx][yy]==2&&!die[xx][yy]){for(XX=xx+1,YY=yy+1;XX<=10&&YY<=10;XX++,YY++){if(map[XX][YY]==0)die[xx][yy]=1,dfs2(XX,YY,num+1,sx,sy),die[xx][yy]=0;else break;}}}for(xx=x-1,yy=y+1;xx>=1&&yy<=10;xx--,yy++)//右上 {if(map[xx][yy]==2&&!die[xx][yy]){for(XX=xx-1,YY=yy+1;XX>=1&&YY<=10;XX--,YY++){if(map[XX][YY]==0)die[xx][yy]=1,dfs2(XX,YY,num+1,sx,sy),die[xx][yy]=0;else break;}}}for(xx=x+1,yy=y-1;xx<=10&&yy>=1;xx++,yy--)//左下 {if(map[xx][yy]==2&&!die[xx][yy]){for(XX=xx+1,YY=yy-1;XX<=10&&YY>=1;XX++,YY--){if(map[XX][YY]==0)die[xx][yy]=1,dfs2(XX,YY,num+1,sx,sy),die[xx][yy]=0;else break;}}}for(xx=x-1,yy=y-1;xx>=1&&yy>=1;xx--,yy--)//左上 {if(map[xx][yy]==2&&!die[xx][yy]){for(XX=xx-1,YY=yy-1;XX>=1&&YY>=1;XX--,YY--){if(map[XX][YY]==0)die[xx][yy]=1,dfs2(XX,YY,num+1,sx,sy),die[xx][yy]=0;else break;}}}
}
void get_ans()
{for(int i=1;i<=10;i++)for(int j=1;j<=10;j++)if(map[i][j]==1) if(!King[i][j]) dfs1(i,j,0,i,j);//普通棋子 else dfs2(i,j,0,i,j);//王棋 if(maxn==0){cnt=0;for(int i=1;i<=10;i++)for(int j=1;j<=10;j++)if(map[i][j]==1){if(!King[i][j]){for(int k=2;k<4;k++){int x=i+dx[k],y=j+dy[k];if(!map[x][y]&&x<=10&&x>=1&&y<=10&&y>=1)//这个地方也要判断越界,掉下会WA的wx[++cnt]=i,wy[cnt]=j;}}else{for(int k=0;k<4;k++){for(int p=1;p<=10;p++){int x=i+dx[k]*p,y=j+dy[k]*p;if(x>10||x<1||y>10||y<1) break;if(map[x][y]) break;wx[++cnt]=i,wy[cnt]=j;}}}}}
}
int main()
{freopen("chess.in","r",stdin);freopen("chess.out","w",stdout);for(int i=1;i<=10;i++)for(int j=1;j<=10;j++){char c;cin>>c;map[i][j]=c-'0';}for(int i=1;i<=10;i++)for(int j=1;j<=10;j++){char c;cin>>c;King[i][j]=c-'0'; }get_ans();printf("%d\n",cnt);for(int i=1;i<=cnt;i++)printf("(%d,%d)\n",wx[i],wy[i]);return 0;
} 

NOIP 模拟题 国际跳棋相关推荐

  1. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  2. NOIp模拟题 之 肮脏的牧师 (桶排序)

    闲话: 考场上看到了这一题,简直令我震惊!啊!居然还有真么简单的模拟题!良心啊! 而且,还是我 痴迷的 熟悉的游戏 --  欧气传说 炉石传说! (话说题面的那三张卡都贼 恶心 好用!都可以在前期打出 ...

  3. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 12  Solved: 9 [Submit][Status][Web Bo ...

  4. 【noip模拟题】天神下凡(贪心)

    vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...

  5. NOIP模拟题——来自风平浪静的明天

    [题目描述] 冬眠了五年,光终于从梦中醒来. 千咲.要,大家都在. 隐约记得"昨天"的海船祭,爱花意外成为贡女,沉入海底. 海面冰封,却有丝丝暖流在冰面之下涌动. 此时,爱花沉睡在 ...

  6. Noip模拟题解题报告

    Pro 第一次AK. 题目链接 Sol 站军姿 算是数学题吧,求出两圆的位置关系,然后余弦定理和扇形面积什么的搞搞就行. #include<iostream> #include<cs ...

  7. noip模拟题11.5

    T1 大天使之剑 [问题描述] 小A在游戏⾥打怪.有⼀次,他⼀下⼦遇到了n个怪物. 每个怪物有一个生命值,第i个怪物的生命值是h_i.而小A除了生命值之外,还有一个属性是魔法值m. 小A和怪物们依次行 ...

  8. noip模拟题11.11 光棍节测试

    T1. tractor 题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1. ...

  9. [Noip模拟题]寿司

    Description 小 c 是一名 oier.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间 AC.为此,他被狠狠地嘲讽了一番.于是, ...

  10. [HZWER NOIP模拟题][杂题][防骗题]数列

    简要题意: 长度为n的数列,有m个询问,每组询问a,b,c,表示要求出最小的i满足a*(i+1)*xi^2+(b+1)*i*xi+c+i=0,为保证强制在线,实际的a=a+lastans(b,c同理) ...

最新文章

  1. MySQL学习笔记(十四)—— MySQL的命令集(4)
  2. 以下关于python自动化运维错误的是_Python在自动化运维时经常会用到的方法
  3. Java Character 方法
  4. android 调用restful,android调用springmvc写的restful
  5. mysql 组合查询_MySQL组合查询教程
  6. 什么叫大地高_什么才叫睡得好?睡觉能满足这5个标准,说明睡眠质量高
  7. android连接SQLite数据库-----增加改查+分页
  8. C++学习 ---- 系列文章
  9. vmware vSphere 7 Candidate候选版本
  10. 中国正在发生或可能发生的变化,将影响未来
  11. ruby 疑难点之—— attr_accessor attr_reader attr_writer
  12. mysql中只运行一部分数据_MySQL(一)——MySQL基础和部分面试题
  13. 何凯明新作ViTDET:目标检测领域,颠覆分层backbone理念
  14. 微软bi报表服务器,为 Power BI 报表服务器创建 Power BI 报表
  15. vue-router 报NavigationDuplicated: Navigating to current location问题解决
  16. 解决文件无法共享的技巧
  17. vue操作dom元素的三种方法介绍和分析
  18. 【博客】RealSense
  19. 星星之火-39: 什么是LTE物理层“时频”资源以及与物理层信道帧结构、物理层信道的关系?
  20. Win11无法删除文件夹怎么办?Win11无法删除文件夹的解决方法

热门文章

  1. Wondershare Flash Gallery Factory
  2. 【五线谱】重音记号、渐强记号、渐弱记号
  3. matlab 电路频率响应_频率响应法与matlab指令计算
  4. python解最强大脑: 黑白迭代
  5. dell r730服务器开启虚拟化,r730服务器不能开启虚拟化(dell开启cpu虚拟化)
  6. 存活探针(Liveness Probe)
  7. Qt 菜单栏、工具栏、状态栏、浮动窗口、核心部件
  8. 长序列测序数据分析的机遇与挑战
  9. 电脑速度慢是什么问题导致的
  10. 解决国外链接下载软件速度慢的方法