nyoj 1034 将军问题
来源:互联网 发布:有什么儿歌软件 编辑:程序博客网 时间:2024/04/30 07:32
将军问题
- 描述
关于中国象棋,想必大家都很熟悉吧。我们知道,在走棋的时候,被对方將军的这种情形是很容易被人察觉的(不然,你也太粗心了)。但是我们的计算机是如何识别这种情形的呢?它显然没有人的这种“直觉”。这就是我们今天要解决的问题,你的任务就是写一段计算机代码,根据当前局面信息,判断是否存在一方正在被另一方將军的情形,并给出正确结果。
图片一
如图一,象棋棋盘由九条竖线和十条横线交叉组成。棋盘上共有九十个交叉点,象棋子就摆放在和活动在这些交叉点上。棋盘中间没有画通直线的地方,叫做“九宫”。棋子共有三十二个,分为红、黑两组,每组共十六个,各分七种,其名称和数目如下:
红棋子: 帅一个,车、马、炮、相、仕各两个,兵五个。
黑棋子: 将一个,车、马、炮、象、士各两个,卒五个。
各种棋子的走法如下:
将(帅)每一步只许前进、后退、横走,但不能走出“九宫”。
士(仕)每一步只许沿“九宫”斜线走一格,可进可退。
象(相)不能越过“河界”,每一步斜走两格,可进可退,即俗称“象(相)走田字“。当田字中心有别的棋子时,俗称”塞象(相)眼“,则不许走过去。
马每步一直(或一横)一斜,可进可退,即俗称”马走日字“。如果在要去的方向有别的棋子挡住,俗称”蹩马腿”,则不许走过去。具体可参考图二。
图片二
车每一步可以直进、直退、横走,不限步数。
炮在不吃子的时候,走法跟车一样。在吃子时必须隔一个棋子(无论是哪一方的)跳吃,即俗称“炮打隔子”。
卒(兵)在没有过“河界”前,没步只许向前直走一格;过“河界”后,每步可向前直走或横走一格,但不能后退。
另外,在一个局面中,如果一方棋子能够走到的位置有对方将(帅)的存在,那么该局面就称为將军局面,我们的任务就是找出这样的局面。根据上述规则,我们很容易就能推断出只有以下几种方式才会造成將军局面:
将(帅)照面。即将和帅在同一直线上。
马对将(帅)的攻击。(注意马有蹩脚)
车对将(帅)的攻击。
炮对将(帅)的攻击。(注意炮要隔一子)
过河兵对将(帅)的攻击。
- 输入
- 输入的第一行为一个正整数n(1<=n<=100)。表示有n个测试局面。
接下来的n次测试,每次输入10行,每行输入9个特定正整数,用来表示一个局面(上黑下红)。其中数字0表示该处无棋子,其他数字具体表示如下:
黑方:将(1)、士(2,3)、象(4,5)、马(6,7)、车(8,9)、炮(10,11)、卒(12,13,14,15,16)
红方:帅(17)、仕(18,19)、相(20,21)、马(22,23)、车(24,25)、炮(26,27)、兵(28,29,30,31,32)
提示:样例中的第一组数据表示的是初始局面,第二组数据表示的是图一的局面。 - 输出
- 如果存在将军局面,则输出"yes"。反之,输出"no"。
- 样例输入
28 6 4 2 1 3 5 7 90 0 0 0 0 0 0 0 00 10 0 0 0 0 0 11 012 0 13 0 14 0 15 0 160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 028 0 29 0 30 0 31 0 320 26 0 0 0 0 0 27 00 0 0 0 0 0 0 0 0 24 22 20 18 17 19 21 23 258 6 4 2 1 3 5 0 90 0 0 0 0 0 0 0 00 10 0 0 0 0 7 11 012 0 13 0 14 0 15 0 160 0 0 0 0 0 0 0 0 0 0 0 0 27 0 0 0 028 0 29 0 30 0 31 0 320 26 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 24 22 20 18 17 19 21 23 25
- 样例输出
no
yes
#include <stdio.h>#include <string.h>int rx,ry,bx,by;int map[12][12];int ma(){ for(int i=22;i<=23;i++){ if(map[bx-1][by-1]==0){ if(map[bx-2][by-1]==i||map[bx-1][by-2]==i) return 1; } if(map[bx-1][by+1]==0){ if(map[bx-2][by+1]==i||map[bx-1][by+2]==i) return 1; } if(map[bx+1][by-1]==0){ if(map[bx+1][by-2]==i||map[bx+2][by-1]==i) return 1; } if(map[bx+1][by+1]==0){ if(map[bx+1][by+2]==i||map[bx+2][by+1]==i) return 1; } } for(int i=6;i<=7;i++){ if(map[rx-1][ry-1]==0){ if(map[rx-2][ry-1]==i||map[rx-1][ry-2]==i) return 1; } if(map[rx-1][ry+1]==0){ if(map[rx-2][ry+1]==i||map[rx-1][ry+2]==i) return 1; } if(map[rx+1][ry-1]==0){ if(map[rx+1][ry-2]==i||map[rx+2][ry-1]==i) return 1; } if(map[rx+1][ry+1]==0){ if(map[rx+1][ry+2]==i||map[rx+2][ry+1]==i){ return 1; } } } return 0;}int zu(){ for(int i = 28;i <= 32;i++) if(map[bx+1][by]==i||map[bx][by+1]==i||map[bx][by-1]==i) return 1; for(int i = 12 ; i <= 16 ;i++) if(map[rx-1][ry]==i||map[rx][ry+1]==i||map[rx][ry-1]==i) return 1; return 0;}int ju(int x,int y){ int j,star,end; if(map[x][y]==1) { star=24,end = 25; } else if(map[x][y]==17) { star = 8,end = 9; } for(int i = 1 ; i <= 9 ;i++) { if(map[x][i]==star||map[x][i]==end){ if( i < y){ int count = 0 ; for( j = i+1 ; j < y ; j++) if(map[x][j]!=0) count ++; if(count == 0) return 1 ; } else if( i > y) { int count = 0; for(j = y+1 ; j < i ; j++) if(map[x][j]!=0) count ++ ; if(count == 0) return 1 ; } } } for(int i = 1 ; i <= 10 ; i++) { if(map[i][y]==star||map[i][y]==end) { if(i < x) { int count = 0; for(j = i+1 ; j < x ; j++) if(map[j][y]!=0) count ++; if(0 == count){ return 1 ;} } if(i > x) { int count = 0 ; for(j = x+1 ; j < i ; j++) if(map[j][y]!=0) count ++ ; if(count == 0){// printf("!!\n"); return 1 ;} } } } return 0;}int pao(int x,int y){ int j,star,end; if(map[x][y]==1) { star=26,end = 27; } else if(map[x][y]==17) { star = 10,end = 11; } for(int i = 1 ; i <= 9 ;i++) { if(map[x][i]==star||map[x][i]==end){ if( i < y){ int count = 0; for( j = i + 1; j < y ; j++) if(map[x][j]!=0) count++; if(count==1){ return 1; } } else if( i > y) { int count = 0; for(j = y+1 ; j < i ; j++) if(map[x][j]!=0) count++; if(count==1) return 1; } } } for(int i = 1 ; i <= 10 ; i++) { if(map[i][y]==star||map[i][y]==end) { if(i < x) { int count = 0 ; for(j = i+1 ; j < x ; j++) if(map[j][y]!=0) count++; if(count==1) return 1; } if(i > x) { int count = 0; for(j = x+1 ; j < i ; j++) if(map[j][y]!=0) count++; if(count==1) return 1; } } } return 0;}int jun(int x,int y){ int n=x,m=y; while(n++) { if(map[n][m]==17) return 1; if(map[n][m]!=0) return 0; } return 0;}int main(void){int n;scanf("%d",&n);while(n--){ memset(map,-1,sizeof(map)); for(int i = 1 ; i <= 10 ; i++) for(int j = 1 ; j <= 9 ; j++){ scanf("%d",&map[i][j]); if(map[i][j]==1){ bx=i;by=j; } if(map[i][j]==17){ rx=i;ry = j; } } int f2=ma();if(f2){printf("yes\n");continue;} int f3=zu();if(f3){printf("yes\n");continue;} int f5=ju(rx,ry);if(f5){printf("yes\n");continue;} int f6=ju(bx,by);if(f6){printf("yes\n");continue;} int f7=pao(rx,ry);if(f7){printf("yes\n");continue;} int f8=pao(bx,by);if(f8){printf("yes\n");continue;} int f9=jun(bx,by);if(f9){printf("yes\n");continue;} printf("no\n");}return 0;}
- nyoj 1034 将军问题
- 拜占廷将军问题[转]
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- NOJ [1002] 将军问题
- NOJ 1002 将军问题
- NOJ 1002 将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题
- 拜占庭将军问题见解
- 拜占庭将军问题
- 拜占庭将军问题
- IOS常见错误分析解决(一直更新) 你值得收藏-综合贴
- GoldenGate DDL配置详解(原创)
- JAVA三种集合LIST、SET、MAP
- 单例模式(Singleton)的创建
- kmp算法实现(转载)
- nyoj 1034 将军问题
- jquery之ajaxfileupload异步上传插件
- slik SVN安装及配置
- Qt获取设置窗口的布局管理器
- OpenCV编程--程序异常终止返回0XFF(255)
- linux 运维常用命令汇总
- Win7/Win8.1真安全,三年漏洞攻击降七成
- sahrepoint 上传到文档库
- [LeetCode]Search in Rotated Sorted Array II