总是WA 自己试了些数据都没问题 有哪位大神愿意给看下
思路就是模拟 先存下来各个点位置 然后让将依次尝试四个位置 把吃掉的子赋值为0 对于每个位置 先判断马 再按四个方向判断车和帅 如果遇到炮或马就看看后边有没有炮
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int xx=10,yy=9;
int a[11][10];//you can't value it when announcing,only memset(a,0,sizeof(a))
int dx[4]={0,1,0,-1},dy[4]={-1,0,1,0};//将增量
int horseX[8]={-2,-2,2,2,-1,1,-1,1};//马dx
int horseY[8]={-1,1,-1,1,-2,-2,2,2};//马dy
int footX[8]={-1,-1,1,1,0,0,0,0};//马别腿fx
int footY[8]={0,0,0,0,-1,-1,1,1};//马别腿fy
bool judge(int nx,int ny){//判断是否生存
a[nx][ny]=0;
int i;
for (i=0;i<7;i++){
int nowi=nx+horseX[i];
int nowj=ny+horseY[i];
if (a[nowi][nowj]==3){
if (a[nx+footX[i]][ny+footY[i]]) return false;
}
}
for (i=nx+1;i<=xx;i++){
if (a[i][ny]!=0){
if ((a[i][ny]==2)||(a[i][ny]==5)) return false;
else for (int j=i+1;j<=xx;j++) if (a[j][ny]==4) return false;
}
}
for (i=ny+1;i<=yy;i++){
if (a[nx][i]!=0){
if ((a[nx][i]==2)||(a[nx][i]==5)) return false;
else for (int j=i+1;j<=yy;j++) if (a[nx][j]==4) return false;
}
}
for (i=nx-1;i>=1;i--) if (a[i][ny]==2) return false;
for (i=ny-1;i>=1;i--){
if (a[nx][i]!=0){
if (a[nx][i]==2) return false;
else for (int j=i-1;j>=1;j--) if (a[nx][j]==4) return false;
}
}
return true;
}
int main(){
memset(a,0,sizeof(a));
int n,nx,ny;
while ((cin>>n>>nx>>ny) && n){
char ch;//R=ju=2;H=ma=3;C=pao=4;G=shuai=5;
int x,y;
for (int i=1;i<=n;i++){
cin>>ch>>x>>y;
if (ch=='R') a[x][y]=2;
else if (ch=='G') a[x][y]=5;
else if (ch=='H') a[x][y]=3;
else if (ch=='C') a[x][y]=4;
}
int k,h,i,j;
bool flag=false;
for (i=0;i<4;i++){
if ((nx+dx[i]<1)||(nx+dx[i]>3)||(ny+dy[i]<4)||(ny+dy[i]>6)) continue;
flag=judge(nx+dx[i],ny+dy[i]);
if (flag) break;
}
if(flag) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}