题意:给出一个棋盘(用数字表示),判断是否已经将军
将军,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;
}