从起床写到现在,情况太多了,写出的代码也很长,不过思路很容易想。
第一次交的时候忘了讨论马走的几种情况,第二次改过来了,结果忘了加judge的返回值,导致如果没对应的情况话返回值为非0。第三次AC了,代码真的略长。。。不容易。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char red[15][15], black[15][15];
int judge(char a[15][15], int x, int y) {
int sign = 0;
for(int i = x + 1; i < 11; i++) { //两将相遇情况
if(a[i][y])
sign++;
if(a[i][y] == 'G'&& sign == 1)
return 1;
else if(sign > 1)
break;
}
sign = 0;
for(int i = x - 1; i > 0; i--) { //黑将上方车能否将军
if(a[i][y])
sign++;
if(a[i][y] == 'R'&& sign == 1)
return 1;
else if(sign > 1)
break;
}
sign = 0;
for(int i = x + 1; i < 11; i++) { //黑将下方车能否将军
if(a[i][y])
sign++;
if(a[i][y] == 'R'&& sign == 1)
return 1;
else if(sign > 1)
break;
}
sign = 0;
for(int i = y - 1; i > 0; i--) { //黑将左边车能否将军
if(a[x][i])
sign++;
if(a[x][i] == 'R'&& sign == 1)
return 1;
else if(sign > 1)
break;
}
sign = 0;
for(int i = y + 1; i < 10; i++) { //黑将右边车能否被将军
if(a[x][i])
sign++;
if(a[x][i] == 'R'&& sign == 1)
return 1;
else if(sign > 1)
break;
}
sign = 0;
for(int i = x - 1; i > 0; i--) { //黑将上方炮能否将军
if(a[i][y])
sign++;
if(a[i][y] == 'C'&& sign == 2)
return 1;
else if(sign > 2)
break;
}
sign = 0;
for(int i = x + 1; i < 11; i++) { //黑将下方炮能否将军
if(a[i][y])
sign++;
if(a[i][y] == 'C'&& sign == 2)
return 1;
else if(sign > 2)
break;
}
sign = 0;
for(int i = y - 1; i > 0; i--) { //黑将左边炮能否将军
if(a[x][i])
sign++;
if(a[x][i] == 'C'&& sign == 2)
return 1;
else if(sign > 2)
break;
}
sign = 0;
for(int i = y + 1; i < 10; i++) { //黑将右边炮能否被将军
if(a[x][i])
sign++;
if(a[x][i] == 'C'&& sign == 2)
return 1;
else if(sign > 2)
break;
}
if(x - 1) { //黑将上方马能否将军
if(!a[x - 1][y - 1]) //黑将左上马能否将军
if(a[x - 1][y - 2] == 'H')
return 1;
if(!a[x - 1][y + 1]) //黑将右上马能否将军
if(a[x - 1][y + 2] == 'H')
return 1;
}
if(x - 2) { //黑将上方马能否将军
if(!a[x - 1][y - 1]) //黑将左上马能否将军
if(a[x - 2][y - 1] == 'H')
return 1;
if(!a[x - 1][y + 1]) //黑将右上马能否将军
if(a[x - 2][y + 1] == 'H')
return 1;
}
if(!a[x + 1][y - 1]) { //黑将左下马能否将军
if(a[x + 1][y - 2] == 'H')
return 1;
if(a[x + 2][y - 1] == 'H')
return 1;
}
if(!a[x + 1][y + 1]) { //黑将右下马能否将军
if(a[x + 1][y + 2] == 'H')
return 1;
if(a[x + 2][y + 1] == 'H')
return 1;
}
return 0;
}
int black_move(int x, int y) {
if(x - 1 > 0)
if(!judge(red, x - 1, y))
return 0;
if(x + 1 < 4)
if(!judge(red, x + 1, y))
return 0;
if(y - 1 > 3)
if(!judge(red, x, y - 1))
return 0;
if(y + 1 < 7)
if(!judge(red, x, y + 1))
return 0;
return 1;
}
int main() {
int a, b, c;
char piece;
int ro, ac; //ro为纵ac为横
while(cin >> a >> b >> c&& a) {
memset(red, 0, sizeof(red));
memset(black, 0, sizeof(black));
black[b][c] = 'G';
while(a--) {
cin >> piece >> ro >> ac;
red[ro][ac] = piece;
}
if(black_move(b, c))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
浙公网安备 33010602011771号