4-1
此题ac但是非常的长,用了我一天半的时间,服了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
2 1 4
G 10 5
R 6 4
3 1 5
H 4 5
G 10 5
C 7 5
0 0 0
//车是R,马是H,炮是C,帅是G
*/
using namespace std;
char c[11][10];//棋子类型是啥
int a[11][10];//会被吃掉的地方
int b[11][10];//此地是否有棋子
int checkpoint(int x, int y)//x,y处是否有棋子
{
if(b[x][y])
{
return 1;
}
else
return 0;
}
void setr(int x, int y)//车能够吃得到的地方
{
for(int i = x-1; i >= 1; --i)
{
if(!checkpoint(i, y) || c[i][y] == 'J')
{
++a[i][y];
//cout << i << " " << y << endl;
}
else if(c[i][y] != 'J')
{
++a[i][y];
break;
}
}
for(int i = x+1; i <= 10; ++i)
{
if(!checkpoint(i, y) || c[i][y] == 'J')
{
++a[i][y];
//cout << i << " " << y << endl;
}
else if(c[i][y] != 'J')
{
++a[i][y];
break;
}
}
for(int j = y+1; j <= 9; ++j)
{
if(!checkpoint(x, j) || c[x][j] == 'J')
{
++a[x][j];
//cout << x << " " << j << endl;
}
else if(c[x][j] != 'J')
{
++a[x][j];
break;
}
}
for(int j = y-1; j >= 1; --j)
{
if(!checkpoint(x, j) || c[x][j] == 'J')
{
++a[x][j];
//cout << x << " " << j << endl;
}
else if(c[x][j] != 'J')
{
++a[x][j];
break;
}
}
}
void clearr(int x, int y)//清除车能够吃得到的地方
{
for(int i = x-1; i >= 1; --i)
{
if(!checkpoint(i, y) || c[i][y] == 'J')
{
--a[i][y];
}
else if(c[i][y] != 'J')
{
--a[i][y];
break;
}
}
for(int i = x+1; i <= 10; ++i)
{
if(!checkpoint(i, y) || c[i][y] == 'J')
{
--a[i][y];
}
else if(c[i][y] != 'J')
{
--a[i][y];
break;
}
}
for(int j = y+1; j <= 9; ++j)
{
if(!checkpoint(x, j) || c[x][j] == 'J')
{
--a[x][j];
}
else if(c[x][j] != 'J')
{
--a[x][j];
break;
}
}
for(int j = y-1; j >= 1; --j)
{
if(!checkpoint(x, j) || c[x][j] == 'J')
{
--a[x][j];
}
else if(c[x][j] != 'J')
{
--a[x][j];
break;
}
}
}
void seth(int x, int y)//马可能够吃到的地方
{
if((x+2)<=10 && !(checkpoint(x+1, y)))
{
if(y-1>=1)
{
++a[x+2][y-1];
//cout << x+2 << " " << y-1 << endl;
}
if(y+1<=9)
{
++a[x+2][y+1];
//cout << x+2 << " " << y+1 << endl;
}
}
if((x-2)>=1 && !(checkpoint(x-1,y)))
{
if(y-1>=1)
{
++a[x-2][y-1];
//cout << x-2 << " " << y-1 << endl;
}
if(y+1<=9)
{
++a[x-2][y+1];
//cout << x-2 << " " << y+1 << endl;
}
}
if((y+2)<=9 && !(checkpoint(x,y+1)))
{
if(x-1>=1)
{
++a[x-1][y+2];
//cout << x-1 << " " << y+2 << endl;
}
if(x+1<=10)
{
++a[x+1][y+2];
//cout << x+1 << " " << y+2 << endl;
}
}
if((y-2)>=1 &&!(checkpoint(x,y-1)))
{
if(x-1>=1)
{
++a[x-1][y-2];
//cout << x-1 << " " << y-2 << endl;
}
if(x+1<=10)
{
++a[x+1][y-2];
//cout << x+1 << " " << y-2 << endl;
}
}
}
void clearh(int x, int y)//清除马可能够吃到的地方
{
if((x+2)<=10 && !(checkpoint(x+1, y)))
{
if(y-1>=1)
{
--a[x+2][y-1];
}
if(y+1<=9)
{
--a[x+2][y+1];
}
}
if((x-2)>=1 && !(checkpoint(x-1,y)))
{
if(y-1>=1)
{
--a[x-2][y-1];
}
if(y+1<=9)
{
--a[x-2][y+1];
}
}
if((y+2)<=9 && !(checkpoint(x,y+1)))
{
if(x-1>=1)
{
--a[x-1][y+2];
}
if(x+1<=10)
{
--a[x+1][y+2];
}
}
if((y-2)>=1 &&!(checkpoint(x,y-1)))
{
if(x-1>=1)
{
--a[x-1][y-2];
}
if(x+1<=10)
{
--a[x+1][y-2];
}
}
}
void setc(int x, int y)//能被炮吃掉的坐标置1;
{
for(int i = x-1; i >= 0; --i)
{
if(checkpoint(i, y) && c[i][y] != 'J')
{
for(int n = i-1; n >= 0; --n)
{
if(!checkpoint(n, y) || c[n][y] == 'J')
{
++a[n][y];
//cout << n << " " << y << endl;
}
else
{
++a[n][y];
break;
}//炮可能有缺陷
}
break;
}
}
for(int j = y+1; y <= 9; ++j)
{
if(checkpoint(x, j) && c[x][j] != 'J')
{
for(int n = j+1; n <= 9; ++n)
{
if(!checkpoint(x, n) || c[x][n] == 'J')
{
++a[x][n];
//cout << x << " " << n << endl;
}
else
{
++a[x][n];
break;
}
}
break;
}
}
for(int j = y-1; j >= 1; --j)
{
if(checkpoint(x, j) && c[x][j] != 'J')
{
for(int n = j-1; n>=1; --n)
{
if(!checkpoint(x, n) || c[x][n] == 'J')
{
++a[x][n];
//cout << x << " " << n << endl;
}
else
{
++a[x][n];
break;
}
}
break;
}
}
}
void setg(int x, int y)
{
for(int i = x-1; i >= 1; --i)
{
if(checkpoint(i,y) && c[i][y] != 'J')
{
++a[i][y];
break;
}
else
{
++a[i][y];
//cout << i << " " << y << endl;
}
}
}
int checkj(int x, int y)//检查奖是否会被吃掉,会返回1;也有缺陷
{
for(int i = x+1; i <= 10; ++i)
{
if(checkpoint(i,y))
{
if(c[i][y] != 'G')
{
break;
}
else if(c[i][y] == 'G')
{
return 0;
}
}
}
if((x+1)<=3)
{
if(checkpoint(x+1,y) && a[x+1][y] < 1)
{
if(c[x+1][y] == 'R')
{
clearr(x+1,y);
}
else if(c[x+1][y] == 'H')
{
clearh(x+1,y);
}
}
}
if(x-1>=1)
{
if(checkpoint(x-1,y) && a[x-1][y] < 1)
{
if(c[x-1][y] == 'R')
{
clearr(x-1,y);
}
else if(c[x-1][y] == 'H')
{
clearh(x-1,y);
}
}
}
if(y+1<=6)
{
if(checkpoint(x,y+1) && a[x][y+1] < 1)
{
if(c[x][y+1] == 'R')
{
clearr(x,y+1);
}
else if(c[x][y+1] == 'H')
{
clearh(x,y+1);
}
}
}
if(y-1>=4)
{
if(checkpoint(x,y-1) && a[x][y-1] < 1)
{
if(c[x][y-1] == 'R')
{
clearr(x,y-1);
}
else if(c[x][y-1] == 'H')
{
clearh(x,y-1);
}
}
}
if(a[x+1][y] != 0 && a[x-1][y] != 0 && a[x][y+1] != 0 && a[x][y-1] != 0)
{
//cout << a[x+1][y] << " " <<a[x-1][y] << " " << a[x][y+1] << " " <<a[x][y-1];
return 1;
}
else
{
return 0;
}
}
int main()
{
//freopen("data.out", "w", stdout);
int countn = 0;
int t[3];
while((cin >> t[0] >> t[1] >> t[2]))
{
if(t[0] == 0)
{
return 0;
}
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, '0', sizeof(c));
for(int j = 0; j < 10; ++j)
{
a[0][j] = 1;
}
for(int j = 4;j<=6;++j)
{
a[4][j] = 1;
}
for(int i = 1; i <= 3; ++i)
{
a[i][3] = 1;
}
for(int i = 1; i <= 3;++i)
{
a[i][7] = 1;
}
c[t[1]][t[2]] = 'J';
b[t[1]][t[2]] = 1;
while(t[0]--)
{
int a1, a2;
char a3;
cin >> a3 >> a1 >> a2;
c[a1][a2] = a3;
b[a1][a2] = 1;
}
for(int i = 1; i <= 10; ++i)
{
for(int j = 1; j <= 9; ++j)
{
if(c[i][j] == 'R')
setr(i, j);
else if(c[i][j] == 'H')
seth(i, j);
else if(c[i][j] == 'C')
setc(i, j);
else if(c[i][j] == 'G')
setg(i, j);
}
}
if(checkj(t[1], t[2]))
{
printf("%s\n", "YES");
//cout << ++countn << endl;
}
else
{
printf("%s\n", "NO");
// cout << ++countn << endl;
}
}
return 0;
}