【疑问】2011 Asia Fuzhou Regional A

总是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;
}


你可能感兴趣的:(基础练习)