P5380 [THUPC2019]鴨棋(模擬)

傳送門

最近代碼能力急劇下降,所以開始刷大模擬
這道題坑點很多,細節都在代碼註釋裏了
code:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    register int s=0,f=1;
    register char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}
    while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
    return s*f;
}
const int captain[20][5]={
    {0,1},{1,0},{0,-1},{-1,0}
};
const int guard[20][5]={
    {1,1},{1,-1},{-1,1},{-1,-1}
};
const int elephant[20][5]={
    {2,-2},{-2,2},{2,2},{-2,-2}
};
const int Elephant[20][5]={
    {1,-1},{-1,1},{1,1},{-1,-1}
};
const int horse[20][5]={
    {2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}
};
const int Horse[20][5]={
    {1,0},{1,0},{0,1},{0,1},{-1,0},{-1,0},{0,-1},{0,-1}
};
const int duck[20][5]={
    {3,2},{-3,2},{2,3},{2,-3},{3,-2},{-3,-2},{-2,3},{-2,-3}
};
const int Duck[20][5]={
    {1,0},{-1,0},{0,1},{0,-1},{1,0},{-1,0},{0,1},{0,-1},
    {2,1},{-2,1},{1,2},{1,-2},{2,-1},{-2,-1},{-1,2},{-1,-2}
};
const int soldier[20][5]={
    {0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}
};
//每個子的走法如上
int color,End,flg;
int a[20][20],h[20][20];
string f[10];
void Clean(){
    f[1]="captain";f[2]="guard";
    f[3]="elephant";f[4]="horse";
    f[5]="car";f[6]="duck";f[7]="soldier";//數字對應棋子

    a[1][1]=a[1][9]=5,h[1][1]=h[1][9]=1;
    a[1][2]=a[1][8]=4,h[1][2]=h[1][8]=1;
    a[1][3]=a[1][7]=3,h[1][3]=h[1][7]=1;
    a[1][4]=a[1][6]=2,h[1][4]=h[1][6]=1;
    a[1][5]=1,h[1][5]=1;
    a[3][1]=a[3][9]=6,h[3][1]=h[3][9]=1;
    a[4][1]=a[4][3]=a[4][5]=a[4][7]=a[4][9]=7;
    h[4][1]=h[4][3]=h[4][5]=h[4][7]=h[4][9]=1;

    a[10][1]=a[10][9]=5,h[10][1]=h[10][9]=2;
    a[10][2]=a[10][8]=4,h[10][2]=h[10][8]=2;
    a[10][3]=a[10][7]=3,h[10][3]=h[10][7]=2;
    a[10][4]=a[10][6]=2,h[10][4]=h[10][6]=2;
    a[10][5]=1,h[10][5]=2;
    a[8][1]=a[8][9]=6,h[8][1]=h[8][9]=2;
    a[7][1]=a[7][3]=a[7][5]=a[7][7]=a[7][9]=7;
    h[7][1]=h[7][3]=h[7][5]=h[7][7]=h[7][9]=2; //初始化棋盤
}
bool bianjie(int x,int y){//邊界判斷
    if(x>=1&&x<=10&&y>=1&&y<=9)return true;
    return false;
}
void Jiangjun(int x){//將軍判斷,x表示將哪一方的軍
    for(int i=1;i<=10;i++){
        for(int j=1;j<=9;j++){
            if(h[i][j]==x)continue;//當前點必須是對方的
            if(a[i][j]==1){//開始模擬每一個棋子
                for(int k=0;k<4;k++){
                    int tx=i+captain[k][0];
                    int ty=j+captain[k][1];
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }else if(a[i][j]==2){
                for(int k=0;k<4;k++){
                    int tx=i+guard[k][0];
                    int ty=j+guard[k][1];
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }else if(a[i][j]==3){
                for(int k=0;k<4;k++){
                    int tx=i+elephant[k][0];
                    int ty=j+elephant[k][1];
                    int px=i+Elephant[k][0];
                    int py=j+Elephant[k][1];
                    if(h[px][py])continue;
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }else if(a[i][j]==4){
                for(int k=0;k<8;k++){
                    int tx=i+horse[k][0];
                    int ty=j+horse[k][1];
                    int px=i+Horse[k][0];
                    int py=j+Horse[k][1];
                    if(h[px][py])continue;
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }else if(a[i][j]==5){
                for(int k=i+1;k<=10;k++){
                    if(h[k][j]==x&&a[k][j]==1){
                        flg=1;
                        return;
                    }
                    if(h[k][j])break;
                }
                for(int k=i-1;k>=1;k--){
                    if(h[k][j]==x&&a[k][j]==1){
                        flg=1;
                        return;
                    }
                    if(h[k][j])break;
                }
                for(int k=j+1;k<=9;k++){
                    if(h[i][k]==x&&a[i][k]==1){
                        flg=1;
                        return;
                    }
                    if(h[i][k])break;
                }
                for(int k=j-1;k>=1;k--){
                    if(h[i][k]==x&&a[i][k]==1){
                        flg=1;
                        return;
                    }
                    if(h[i][k])break;
                }
            }else if(a[i][j]==6){
                for(int k=0;k<8;k++){
                    int tx=i+duck[k][0];
                    int ty=j+duck[k][1];
                    int px1=i+Duck[k][0],px2=i+Duck[k+8][0];
                    int py1=j+Duck[k][1],py2=j+Duck[k+8][1];
                    if(h[px1][py1]||h[px2][py2])continue;
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }else if(a[i][j]==7){
                for(int k=0;k<8;k++){
                    int tx=i+soldier[k][0];
                    int ty=j+soldier[k][1];
                    if(h[tx][ty]==x&&a[tx][ty]==1){
                        flg=1;
                        return;
                    }
                }
            }
        }
    }
}
void jiangjun(){
    Jiangjun(1),Jiangjun(2);//是否將軍
    if(flg==1)cout<<"yes;";
    else cout<<"no;";
    flg=0;//注意清0哦~
}
bool checkcaptain(){
    int tot=0;
    for(int i=1;i<=10;i++){
        for(int j=1;j<=9;j++){
            if(a[i][j]==1)tot++;
        }
    }
    return tot==2;
}
void printst(int x,int y){
    if(h[x][y]==1)cout<<"red ";
    else cout<<"blue ";
    cout<<f[a[x][y]]<<";";
}
void check1(int x,int y,int dx,int dy){
    for(int i=0;i<4;i++){
        int tx=x+captain[i][0];
        int ty=y+captain[i][1];//下一個點
        if(tx==dx&&ty==dy){
            printst(x,y);//輸出當前點
            if(h[tx][ty]==2-color%2)printst(tx,ty);//輸出下一個點
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();//判斷是否存在將軍局面
            if(checkcaptain())cout<<"no"<<"\n";//判王
            else cout<<"yes"<<"\n",End=1;
            color++;//注意換成對方走棋
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
void check2(int x,int y,int dx,int dy){
    for(int i=0;i<4;i++){
        int tx=x+guard[i][0];
        int ty=y+guard[i][1];
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
void check3(int x,int y,int dx,int dy){
    for(int i=0;i<4;i++){
        int tx=x+elephant[i][0];
        int ty=y+elephant[i][1];
        int px=x+Elephant[i][0];
        int py=y+Elephant[i][1];
        if(h[px][py])continue;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
void check4(int x,int y,int dx,int dy){
    for(int i=0;i<8;i++){
        int tx=x+horse[i][0];
        int ty=y+horse[i][1];
        int px=x+Horse[i][0];
        int py=y+Horse[i][1];
        if(h[px][py])continue;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
void check5(int x,int y,int dx,int dy){
    for(int i=x+1;i<=10;i++){//車的拓展
        int tx=i,ty=y;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
        if(h[tx][ty])break;
    }
    for(int i=x-1;i>=1;i--){
        int tx=i,ty=y;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
        if(h[tx][ty])break;
    }
    for(int i=y+1;y<=9;i++){
        int tx=x,ty=i;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
        if(h[tx][ty])break;
    }
    for(int i=y-1;y>=1;i--){
        int tx=x,ty=i;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
        if(h[tx][ty])break;
    }
    cout<<"Invalid command"<<"\n";
}
void check6(int x,int y,int dx,int dy){
    for(int i=0;i<8;i++){
        int tx=x+duck[i][0];
        int ty=y+duck[i][1];
        int px1=x+Duck[i][0],px2=x+Duck[i+8][0];
        int py1=y+Duck[i][1],py2=y+Duck[i+8][1];
        if(h[px1][py1]||h[px2][py2])continue;
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
void check7(int x,int y,int dx,int dy){
    for(int i=0;i<8;i++){
        int tx=x+soldier[i][0];
        int ty=y+soldier[i][1];
        if(tx==dx&&ty==dy){
            printst(x,y);
            if(h[tx][ty]==2-color%2)printst(tx,ty);
            else cout<<"NA;";
            a[tx][ty]=a[x][y],h[tx][ty]=h[x][y];
            a[x][y]=h[x][y]=0;

            jiangjun();
            if(checkcaptain())cout<<"no"<<"\n";
            else cout<<"yes"<<"\n",End=1;
            color++;
            return;
        }
    }
    cout<<"Invalid command"<<"\n";
}
int main(){
    Clean();
    int T=read();
    while(T--){
        int xs=read()+1,ys=read()+1,xt=read()+1,yt=read()+1;
        if((!bianjie(xs,ys))||(!bianjie(xt,yt))||End){//判斷程序結束或是起點和落子點出界
            cout<<"Invalid command"<<"\n";
            continue;
        }

        if(color%2==0){//判斷當前哪一方走棋
            if(h[xs][ys]!=1||h[xt][yt]==1){
                cout<<"Invalid command"<<"\n";
                continue;
            }
        }else{
            if(h[xs][ys]!=2||h[xt][yt]==2){
                cout<<"Invalid command"<<"\n";
                continue;
            }
        }
        if(a[xs][ys]==1)check1(xs,ys,xt,yt);
        else if(a[xs][ys]==2)check2(xs,ys,xt,yt);
        else if(a[xs][ys]==3)check3(xs,ys,xt,yt);
        else if(a[xs][ys]==4)check4(xs,ys,xt,yt);
        else if(a[xs][ys]==5)check5(xs,ys,xt,yt);
        else if(a[xs][ys]==6)check6(xs,ys,xt,yt);
        else if(a[xs][ys]==7)check7(xs,ys,xt,yt);//分類討論每一個點
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章