HDU 4121 Xiangqi

来源:互联网 发布:无法访问家庭网络共享 编辑:程序博客网 时间:2024/05/29 19:03

又是一道大型模拟题。题意为给你一个残局,一边只剩一个将,问任意挪动这个将之后是否都会被将死,完全符合中国象棋的规则。

好了第一步拆分问题。等等,题你真的看清了吗?

有没有想到将只能在中上方9个位置移动?有没有发现象棋棋盘是9*10而不是10*10?有没有考虑照将?有没有考虑蹩马腿。反正我不是没考虑就是考虑错了。

仔细的理解题意,下面的模拟就是简单了,马,车,炮,将,分别作为四个子问题进行考虑,也就是NOIP普及组的模拟题水平了。

下附AC代码。

#include<iostream>#include<stdio.h>#include<string.h>#define maxn 15using namespace std;int n,px,py;char gra[maxn][maxn];int flag=false;int fx[maxn]={0,0,0,1,-1};int fy[maxn]={0,1,-1,0,0};int mx[maxn]={0,1,1,2,2,-1,-1,-2,-2};int my[maxn]={0,2,-2,1,-1,2,-2,1,-1};int bx[maxn]={0,1,1,1,1,-1,-1,-1,-1};int by[maxn]={0,1,-1,1,-1,1,-1,1,-1};bool checkche(int nx,int ny){for(int i=nx+1;i<=10;i++){if(gra[i][ny]!=0){if(gra[i][ny]=='G' || gra[i][ny]=='R')return true;elsebreak;}}for(int i=nx-1;i>=1;i--){if(gra[i][ny]!=0){if(gra[i][ny]=='R')return true;else break;}}for(int i=ny-1;i>=1;i--){if(gra[nx][i]!=0){if(gra[nx][i]=='R')return true;elsebreak;}}for(int i=ny+1;i<=9;i++){if(gra[nx][i]!=0){if(gra[nx][i]=='R')return true;elsebreak;}}return false;}bool checkpao(int nx,int ny){int blo=0;for(int i=ny+1;i<=9;i++){if(blo==1 && gra[nx][i]=='C')return true;if(blo>=2)break;if(gra[nx][i]!=0)blo++;}blo=0;for(int i=ny-1;i>=1;i--){if(blo==1 && gra[nx][i]=='C')return true;if(blo>=2)break;if(gra[nx][i]!=0)blo++;}blo=0;for(int i=nx+1;i<=10;i++){if(blo==1 && gra[i][ny]=='C')return true;if(blo>=2) break;if(gra[i][ny]!=0)blo++;}blo=0;for(int i=nx-1;i>=1;i--){if(blo==1 && gra[i][ny]=='C')return true;if(blo>=2) break;if(gra[i][ny]!=0)blo++;}for(int i=1;i<=8;i++){int xx=nx+mx[i];int yy=ny+my[i];int bxx=nx+bx[i];int byy=ny+by[i];if(1<=xx && xx<=10 && 1<=yy && yy<=9 && gra[xx][yy]=='H' && gra[bxx][byy]==0)return true;}return false;}bool dfs(int nx,int ny){if(checkche(nx,ny))return true;if(checkpao(nx,ny))return true;return false;}int main(){while(cin>>n>>px>>py && (n || px || py)){memset(gra,0,sizeof(gra));for(int i=1;i<=n;i++){char a;int x,y;cin>>a>>x>>y;gra[x][y]=a;}flag=false;for(int i=1;i<=4;i++){int nx=px+fx[i];int ny=py+fy[i];if(1<=nx && nx<=3 && 4<=ny && ny<=6){if(dfs(nx,ny)==false){cout<<"NO";flag=true;break;}}}if(flag==false)cout<<"YES";cout<<endl;}} 

原创粉丝点击