分享一下我的思路吧
先判断初始局面是不是老将脸对脸,如果是的话,黑方获胜,输出NO
如果不是,黑方老将最多只有走下一步的方式,判断一下走完之后是否仍被将军,是就输出YES,否就输出N
判断黑方老将是否被将军时,车炮红将的判断方法十分嘞,都是横和竖,具体条件不太一样罢了,所以很好写,判断马时,就是八个位置,八种情况
#include <stdio.h>
#include <string.h>
int Kill(char XQ[11][10], int a, int b)
{//判断走一步之后的黑方是否被将军
char ch;
for(int i = 1; i <= 10; i++)
{
for(int j = 1; j <= 9; j++)
{
ch = XQ[i][j];
if(ch == 'R' || ch == 'G')
{//车或将
int a0 = a, b0 = b, mark = 1;
if(a0 == i)
{//车与黑帅在同一行
if(b0 > j)//黑帅在右
{
--b0;
for(;b0 > j; b0--)
{
if(XQ[a0][b0] != 'A') {mark = 0; break;}
}
}
if(b > j && mark) return 1;
if(b0 < j)//黑帅在左
{
++b0;
for(; b0 < j; b0++)
{
if(XQ[a0][b0] != 'A') {mark = 0; break;}
}
}
if(b < j && mark) return 1;
}
if(b0 == j)
{//车与黑帅在同一列
if(a0 > i)//黑帅在下
{
--a0;
for(;a0 > i; a0--)
{
if(XQ[a0][b0] != 'A') {mark = 0; break;}
}
}
if(a > i && mark) return 1;
if(a0 < i)//黑帅在上
{
++a0;
for(; a0 < i; a0++)
{
if(XQ[a0][b0] != 'A') {mark = 0; break;}
}
}
if(a < i && mark) return 1;
}
}
else if(ch == 'C')
{//炮
int a0 = a, b0 = b, count = 0;
if(a0 == i)
{//炮与黑帅在同一行
if(b0 > j)//黑帅在右
{
--b0;
for(;b0 > j; b0--)
if(XQ[a0][b0] != 'A') count++;
}
if(b > j && count == 1) return 1;
if(b0 < j)//黑帅在左
{
++b0;
for(; b0 < j; b0++)
if(XQ[a0][b0] != 'A') count++;
}
if(b < j && count == 1) return 1;
}
if(b0 == j)
{//炮与黑帅在同一列
if(a0 > i)//黑帅在下
{
--a0;
for(;a0 > i; a0--)
if(XQ[a0][b0] != 'A') count++;
}
if(a > i && count == 1) return 1;
if(a0 < i)//黑帅在上
{
++a0;
for(; a0 < i; a0++)
if(XQ[a0][b0] != 'A') count++;
}
if(a < i && count == 1) return 1;
}
}
else if(ch == 'H')
{//马
if(i-1 == a && j+2 == b && XQ[i][j+1] == 'A') return 1;
if(i-2 == a && j+1 == b && XQ[i-1][j] == 'A') return 1;
if(i+1 == a && j+2 == b && XQ[i][j+1] == 'A') return 1;
if(i+2 == a && j+1 == b && XQ[i+1][j] == 'A') return 1;
if(i-2 == a && j-1 == b && XQ[i-1][j] == 'A') return 1;
if(i-1 == a && j-2 == b && XQ[i][j-1] == 'A') return 1;
if(i+1 == a && j-2 == b && XQ[i][j-1] == 'A') return 1;
if(i+2 == a && j-1 == b && XQ[i+1][j] == 'A') return 1;
}
}
}
return 0;
}
int main()
{
int num, x, y, x1, y1;
char XQ[11][10];
START:while(scanf("%d%d%d", &num, &x, &y) == 3 && num)
{
getchar();
memset(XQ, 'A', sizeof(XQ));
while(num--)
{
char r_piece;
int r_x, r_y;
scanf("%c%d%d", &r_piece, &r_x, &r_y);
if(r_piece == 'G') {x1 = r_x; y1 = r_y;}
XQ[r_x][r_y] = r_piece;
getchar();
}
int kill = 0;
if(y1 == y)
{//别忽略黑帅的决胜能力,如果初始局面是老将对脸,则黑方胜利
int x0 = x+1, flag = 0;
for(; x0 < x1; x0++)
if(XQ[x0][y] != 'A') flag = 1;
if(!flag)
{
printf("NO\n");
goto START;
}
}
//黑方只有四种移动的可能,移动之后判断是否仍被将军即可
if(x - 1 >= 1)
{
XQ[x-1][y] = 'X';
if(!Kill(XQ, x-1, y)) {printf("NO\n"); goto START;}
else {XQ[x-1][y] = 'A'; kill = 1;}
}
if(x + 1 <= 3)
{
XQ[x+1][y] = 'X';
if(!Kill(XQ, x+1, y)) {printf("NO\n"); goto START;}
else {XQ[x+1][y] = 'A'; kill = 1;}
}
if(y - 1 >= 4)
{
XQ[x][y-1] = 'X';
if(!Kill(XQ, x, y-1)) {printf("NO\n"); goto START;}
else {XQ[x][y-1] = 'A'; kill = 1;}
}
if(y + 1 <= 6)
{
XQ[x][y+1] = 'X';
if(!Kill(XQ, x, y+1)) {printf("NO\n"); goto START;}
else {XQ[x][y+1] = 'A'; kill =1;}
}
if(kill) printf("YES\n");
}
return 0;
}