[THUPC2019]鸭棋

    科技2024-06-11  87

    一、题目

    点此看题

    二、解法

    发现模拟题挺简单的,不知道怎么就评成黑题了。

    思路理清楚就切了,最好边写边打注释,作者留个档。

    #include <cstdio> #include <iostream> using namespace std; const int M = 15; int read() { int num=0,flag=1;char c; while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1; while(c>='0'&&c<='9')num=(num<<3)+(num<<1)+(c^48),c=getchar(); return num*flag; } int n,m,q,cur,flag,a[M][M],b[M][M]; string na[M]={"","captain","guard","elephant","horse","car","duck","soldier"}; string arm[3]={"","red","blue"}; /* 1 王 2 士 3 象 4 马 5 车 6 鸭 7 兵 */ void init() { //建图,对了 a[1][1]=a[1][9]=a[10][1]=a[10][9]=5;//车 a[1][2]=a[1][8]=a[10][2]=a[10][8]=4;//马 a[1][3]=a[1][7]=a[10][3]=a[10][7]=3;//象 a[1][4]=a[1][6]=a[10][4]=a[10][6]=2;//士 a[1][5]=a[10][5]=1;//王 a[3][1]=a[3][9]=a[8][1]=a[8][9]=6;//鸭 a[4][1]=a[4][3]=a[4][5]=a[4][7]=a[4][9]= a[7][1]=a[7][3]=a[7][5]=a[7][7]=a[7][9]=7;//兵 //阵营,1红2蓝 for(int i=1;i<=9;i++) b[1][i]=1,b[10][i]=2; for(int i=1;i<=9;i+=2) b[4][i]=1,b[7][i]=2; b[3][1]=b[3][9]=1,b[8][1]=b[8][9]=2; } int ins(int x,int y) { return x>=1 && x<=n && y>=1 && y<=m; } int move(int x,int y,int px,int py,int t) //移动,我准备先移动再判将军 { if(t==1)//王的 { int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; for(int i=0;i<4;i++) { int tx=x+dx[i],ty=y+dy[i]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } return 0; } if(t==2)//士的 { int dx[4]={1,-1,1,-1},dy[4]={1,-1,-1,1}; for(int i=0;i<4;i++) { int tx=x+dx[i],ty=y+dy[i]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } return 0; } if(t==3)//象的 { int d[2]={1,-1}; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int rex=x+d[i],rey=y+d[j]; if(b[rex][rey]) continue; int tx=x+2*d[i],ty=y+2*d[j]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } return 0; } if(t==4)//(你)马的 { int d[2]={1,-1}; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int rex=x+d[i]; if(b[rex][y]) continue; int tx=x+2*d[i],ty=y+d[j]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int rey=y+d[j]; if(b[x][rey]) continue; int tx=x+d[i],ty=y+2*d[j]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } return 0; } if(t==5)//车的 { for(int i=y-1;i>=1;i--)//同一列左 { int tx=x,ty=i; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; if(b[tx][ty]) break; } for(int i=y+1;i<=9;i++)//同一列右 { int tx=x,ty=i; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; if(b[tx][ty]) break; } for(int i=x-1;i>=1;i--)//同一行上 { int tx=i,ty=y; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; if(b[tx][ty]) break; } for(int i=x+1;i<=10;i++)//同一行上 { int tx=i,ty=y; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; if(b[tx][ty]) break; } return 0; } if(t==6)//鸭 { int d[2]={1,-1}; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int rx1=x+d[i],ry1=y; if(b[rx1][ry1]) continue; int rx2=x+2*d[i],ry2=y+d[j]; if(b[rx2][ry2]) continue; int tx=x+3*d[i],ty=y+2*d[j]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) { int rx1=x,ry1=y+d[j]; if(b[rx1][ry1]) continue; int rx2=x+d[i],ry2=y+2*d[j]; if(b[rx2][ry2]) continue; int tx=x+2*d[i],ty=y+3*d[j]; if(tx==px && ty==py && ins(tx,ty) && b[tx][ty]!=b[x][y]) return 1; } return 0; } if(t==7)//兵,递归到王和士,真不错 { if(move(x,y,px,py,1)) return 1; if(move(x,y,px,py,2)) return 1; return 0; } return 0; } int attack(int t) { int tx=0,ty=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]==1 && b[i][j]==t) tx=i,ty=j; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if((t==1 && b[i][j]==2) || (t==2 && b[i][j]==1)) if(a[i][j]>1 && move(i,j,tx,ty,a[i][j])) return 1; return 0; } signed main() { //freopen("1.in","r",stdin); //freopen("zxy.out","w",stdout); n=10;m=9;init(); q=read();cur=1; while(q--) { int xs=read()+1,ys=read()+1,xt=read()+1,yt=read()+1; if(flag || cur!=b[xs][ys] || !move(xs,ys,xt,yt,a[xs][ys])) { puts("Invalid command"); continue; } if(cur==1) cur=2;else cur=1; cout<<arm[b[xs][ys]]<<" "<<na[a[xs][ys]]<<";"; if(a[xt][yt]) cout<<arm[b[xt][yt]]<<" "<<na[a[xt][yt]]<<";"; else cout<<"NA"<<";"; flag=(a[xt][yt]==1); a[xt][yt]=a[xs][ys];b[xt][yt]=b[xs][ys]; a[xs][ys]=b[xs][ys]=0; if(flag) { cout<<"no;yes"<<endl; continue; } if(attack(1) || attack(2)) cout<<"yes;no"<<endl; else cout<<"no;no"<<endl; } }
    Processed: 0.011, SQL: 8