好吧,本题采用的方法是直接模拟,把红方可以攻击到的位置全部都记录下来,然后判定黑方是不是在4个方向上都可能走到
PS:在判定炮的路线的时候少写了一个判断条件,直接导致陷入无限WA。。。最后和网上的源码一段段来比较才发现是这样的一个问题。。。看来写代码的时候还是不够仔细。。。
还有一点,用scanf(“%d%d%d%*c")和scanf("%c%d%d%*c")莫名WA,怀疑是数据某个地方多了空格导致,这道题目还是折腾了我一晚上+一个上午的。。。
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
int n,bx,by,x,y,attack[15][15];
char c,board[15][15];
vector<pair<int,int>> v;
void setattack(int i);
bool checkmate();
int main(){
ios_base::sync_with_stdio(false);
while(cin>>n>>bx>>by&&n){
for(int i=0;i<n;++i){
cin>>c>>x>>y,board[x][y]=c,v.push_back(make_pair(x,y));
}
for(int i=0;i<v.size();++i)
setattack(i);
printf("%s\n",(checkmate()?"YES":"NO"));
memset(board,0,sizeof(board));
memset(attack,0,sizeof(attack));
v.clear();
}
return 0;
}
bool checkmate(){
if(bx==1){
if(by==4)
return attack[2][4]&&attack[1][5];
else if(by==5)
return attack[1][4]&&attack[2][5]&&attack[1][6];
else
return attack[1][5]&&attack[2][6];
}
else if(bx==2){
if(4==by)
return attack[1][4]&&attack[2][5]&&attack[3][4];
else if(5==by)
return attack[2][4]&&attack[1][5]&&attack[3][5]&&attack[2][6];
else
return attack[1][6]&&attack[2][5]&&attack[3][6];
}
else{
if(4==by)
return attack[2][4]&&attack[3][5];
else if(5==by)
return attack[3][4]&&attack[3][6]&&attack[2][5];
else
return attack[2][6]&&attack[3][5];
}
}
void setattack(int i){
switch(board[v[i].first][v[i].second]){
case 'G':{
int ch=-1;
while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
attack[v[i].first+ch][v[i].second]=1;
break;
}
case 'H':{
if(v[i].first>2&&!board[v[i].first-1][v[i].second]){
if(v[i].second>1)
attack[v[i].first-2][v[i].second-1]=1;
if(v[i].second<9)
attack[v[i].first-2][v[i].second+1]=1;
}
if(v[i].first<9&&!board[v[i].first+1][v[i].second]){
if(v[i].second>1)
attack[v[i].first+2][v[i].second-1]=1;
if(v[i].second<9)
attack[v[i].first+2][v[i].second+1]=1;
}
if(v[i].second>2&&!board[v[i].first][v[i].second-1]){
if(v[i].first>1)
attack[v[i].first-1][v[i].second-2]=1;
if(v[i].first<10)
attack[v[i].first+1][v[i].second-2]=1;
}
if(v[i].second<8&&!board[v[i].first][v[i].second+1]){
if(v[i].first>1)
attack[v[i].first-1][v[i].second+2]=1;
if(v[i].first<10)
attack[v[i].first+1][v[i].second+2]=1;
}
break;
}
case 'C':{
int ch=1;
while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])++ch;
if(board[v[i].first+ch][v[i].second]){
++ch;
while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,++ch;
attack[v[i].first+ch][v[i].second]=1;
}
ch=-1;
while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])--ch;
if(board[v[i].first+ch][v[i].second]){
--ch;
while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
attack[v[i].first+ch][v[i].second]=1;
}
ch=1;
while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])++ch;
if(board[v[i].first][v[i].second+ch]){
++ch;
while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,++ch;
attack[v[i].first][v[i].second+ch]=1;
}
ch=-1;
while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])--ch;
if(board[v[i].first][v[i].second+ch]){
--ch;
while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,--ch;
attack[v[i].first][v[i].second+ch]=1;
}
break;
}
case 'R':{
int ch=1;
while(v[i].first+ch<10&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,++ch;
attack[v[i].first+ch][v[i].second]=1;
ch=-1;
while(v[i].first+ch>1&&!board[v[i].first+ch][v[i].second])attack[v[i].first+ch][v[i].second]=1,--ch;
attack[v[i].first+ch][v[i].second]=1;
ch=1;
while(v[i].second+ch<9&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,++ch;
attack[v[i].first][v[i].second+ch]=1;
ch=-1;
while(v[i].second+ch>1&&!board[v[i].first][v[i].second+ch])attack[v[i].first][v[i].second+ch]=1,--ch;
attack[v[i].first][v[i].second+ch]=1;
break;
}
}
}