NOJ 1002 将军问题

来源:互联网 发布:java内部类初始化 编辑:程序博客网 时间:2024/04/30 06:20

题意:给出一个棋盘(用数字表示),判断是否已经将军

将军,5种可能:

1 将对帅

2 兵    三个点

3炮 同行或同列妻子的第二个(从将的位置发散)

4马 4个蹩脚点,一个蹩脚点对应两个落脚点

5车 同行同列棋子的第一个

#include <iostream>using namespace std;int map[15][15];int jiang(int x1,int x2,int y){int i;for( i = x1 + 1; i < x2 ; i++)if(map[i][y] != 0)return 0;return 1;}int bing (int x,int y){if(map[x][y] == 1){if(map[x][y-1] >= 28 && map[x][y-1] <= 32)return 1;if(map[x+1][y] >= 28 && map[x+1][y] <= 32)return 1;if(map[x][y+1] >= 28 && map[x][y+1] <= 32)return 1;}else {if(map[x][y-1] >= 12 && map[x][y-1] <= 16)return 1;if(map[x-1][y] >= 12 && map[x-1][y] <= 16)return 1;if(map[x][y+1] >= 12 && map[x][y+1] <= 16)return 1;}return 0;}int pao(int x,int y){int min;int i;int flag1,flag2,flag3,flag4;min = 27 - map[x][y];flag1 = 0;flag2 = 0;flag3 = 0;flag4 = 0;for(i = 1 ; i < 10; i++){if(map[x][y-i] != 0 && flag1 < 2 && y-i >= 0){flag1++;if(flag1 == 2)if(map[x][y-i] == min || map[x][y-i] == min+1)return 1;}if(map[x][y+i] != 0 && flag2 < 2 && y+i < 9){flag2++;if(flag2 == 2)if(map[x][y+i] == min || map[x][y+i] == min+1)return 1;}if(map[x-i][y] != 0 && flag3 < 2 && x-i >= 0){flag3++;if(flag3 == 2)if(map[x-i][y] == min || map[x-i][y] == min+1)return 1;}if(map[x+i][y] != 0 && flag4 < 2 && x+i <10){flag4++;if(flag4 == 2)if(map[x+i][y] == min || map[x+i][y] == min+1)return 1;}}return 0;}int cha(int x,int y){int flag1,flag2,flag3,flag4;int min;int i;min = 25 - map[x][y];flag1 = 0;flag2 = 0;flag3 = 0;flag4 = 0;for(i = 1 ; i < 10; i++){if(map[x][y-i] != 0 && !flag1 && y-i >= 0){flag1++;if(map[x][y-i] == min || map[x][y-i] == min+1)return 1;}if(map[x][y+i] != 0 && !flag2 && y+i < 9){flag2++;if(map[x][y+i] == min || map[x][y+i] == min+1)return 1;}if(map[x-i][y] != 0 && !flag3 && x-i >= 0){flag3++;if(map[x-i][y] == min || map[x-i][y] == min+1)return 1;}if(map[x+i][y] != 0 && !flag4 && x+i <10){flag4++;if(map[x+i][y] == min || map[x+i][y] == min+1)return 1;}}return 0;}int ma(int x,int y){if(map[x][y] == 1){if(map[x+1][y-1] == 0){if(map[x+1][y-2] == 22||map[x+1][y-2] == 23)return 1;if(map[x+2][y-1] == 22||map[x+2][y-1] == 23)return 1; }if(map[x+1][y+1] == 0){if(map[x+1][y+2] == 22||map[x+1][y+2] == 23)return 1;if(map[x+2][y+1] == 22||map[x+2][y+1] == 23)return 1;}if(x >= 0){if(map[x-1][y-1] == 0)if(map[x-1][y-2] == 22 || map[x-1][y-2] == 23)return 1;if(map[x-1][y+1] == 0)if(map[x-1][y+2] == 22 || map[x-1][y+2] == 23)return 1;if( x == 2){if(map[x-1][y-1] == 0)if(map[x-2][y-1] == 22 ||map[x-2][y-1] == 23)return 1;if(map[x-1][y+1] == 0)if(map[x-2][y+1] == 22 || map[x-2][y+1] == 23)return 1;}}}else {if(!map[x-1][y-1]){if(map[x-2][y-1] == 6 || map[x-2][y-1] == 7)return 1;if(map[x-1][y-2] == 6 || map[x-1][y-2] == 7)return 1;}if(!map[x-1][y+1]){if(map[x-1][y+2] == 6 || map[x-1][y+2] == 7)return 1;if(map[x-2][y+1] == 6 || map[x-2][y+1] == 7)return 1;}if(x < 9){if(!map[x+1][y-1])if(map[x+1][y-2] == 6 || map[x+1][y-2] == 7)return 1;if(!map[x+1][y+1])if(map[x+1][y+2] == 6 || map[x+1][y+2] == 7)return 1;if(x == 7){if(map[x+1][y-1] == 0)if(map[x+2][y-1] == 6 || map[x+2][y-1] == 7)return 1;if(!map[x+1][y+1])if(map[x+2][y+1] == 6 || map[x+2][y+1] == 7)return 1;}}}return 0;}int main(){int x1,y1,x2,y2;int i,j,n,answer;cin>>n;while(n--){answer = 0;for(i = 0; i < 10; i++)for(j = 0; j < 9; j++){cin>>map[i][j];if(map[i][j] == 1){x1 = i;y1 = j;}if(map[i][j] == 17){x2 = i;y2 = j;}}if( y1 == y2)answer = jiang(x1,x2,y1);if(!answer)answer = bing(x1,y1)||bing(x2,y2)||ma(x1,y1)||ma(x2,y2)||pao(x1,y1)||pao(x2,y2)||cha(x1,y1)||cha(x2,y2);//cout<<" "<<bing(x1,y1)<<bing(x2,y2)<<ma(x1,y1)<<ma(x2,y2)<<pao(x1,y1)<<pao(x2,y2)<<cha(x1,y1)<<cha(x2,y2);if(answer)cout<<"yes\n";else cout<<"no\n";}return 0;} 


0 0
原创粉丝点击