NOIP 模拟题 国际跳棋
2017-10-25 16:50
169 查看
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)的搜索。
文件名 输入文件 输出文件 时间限制 空间限制
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++) ef18 { 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 模拟题 排列
- NOIP模拟题 2016.11.4 [数论] [费马小定理] [最短路] [建图]
- NOIP模拟题
- 【noip模拟题】[dp][二分][树链剖分][hdu5029][线段树]
- 【NOIP模拟题】【线段树】2016.11.10第三题题解
- xjoi10月17日noip提高组模拟题
- NOIP模拟题 2016.11.15 [LIS] [spfa] [同余最短路] [矩阵快速幂] [容斥原理] [数学]
- 【NOIP模拟题】【DP】【LIS】【中缀表达式】2016.11.15 第一题 小L的二叉树 题解
- (转)【NOIP模拟题】【线段树】【扫描线】2016.11.17 第三题 矩形 题解
- 【动规递推】【120718测试】【NOIP模拟题】最大数列
- noip模拟题题解集
- 【noip模拟题】天神下凡(贪心)
- 湖南NOIP集训模拟题DAY1 BY ExfJOE [贪心][DP][二分]
- 2016.7.14 noip2014模拟题 LGTB的日常~(自己乱安的名字hhh
- noip模拟题 小奇2 by hzwer[DP][路径压缩][分类讨论][位运算]
- [Noip模拟题]绿豆蛙的归宿
- NOIP模拟题 订餐
- NOIP模拟题[贪心][离散化][LIS]
- 【NOIP 模拟题】[T2]拯救紫萱学姐(kmp+树形dp)
- NOIP模拟题[数论}[暴力][拆点]