洛谷uva220

调了大概三天......我必须承认看似简单的题目却真的很折磨人。

黑白棋 Othello - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

有几个坑点需要注意:

1、首先是格式问题:Black.-..9 White.-.16每个棋子的个数都要保持三个字符位。

2、“M r c 指令放一枚棋子在 (r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。保证输入合法。输出操作后的黑白棋子总数。”这句话的歧义。真正的理解是当前游戏者在整个棋盘上不具备合法操作时,进行游戏者转换(我就是因为这个卡了三天......)。

主要代码:

#include<bits/stdc++.h>
using namespace std;
char a[10][10];
int dx[] = {0,-1, -1, -1, 0, 1, 1, 1, 0};
int dy[] = {0,-1, 0, 1, 1, 1, 0, -1, -1};
int print(char s1,char s2,int b[10][10]){//合法操作的判断及输出
    for (int i=1;i<=8;i++) //八个方向的探索
        for (int j=1;j<=8;j++)
            for (int k=1;k<=8;k++){
                int x=j+dx[i],y=k+dy[i];
                if (a[j][k]=='-' && x>0 && x<9 && y>0 && y<9 && a[x][y]==s2){   //该位置可以防止棋子
                    while (x>0 && x<9 && y>0 && y<9 && a[x][y]==s2){x+=dx[i];y+=dy[i];}   //向一个方向探索到头
                    if (x>0 && x<9 && y>0 && y<9 && a[x][y]==s1) b[j][k]=1;  //”夹住“的边界判断
                }
            }
    int cnt=0;//合法操作个数
    for (int j=1;j<=8;j++)  //打印所以的合法操作
        for (int k=1;k<=8;k++){
            if (b[j][k])
                if (!cnt){printf("(%d,%d)",j,k);cnt++;}
                else printf(" (%d,%d)",j,k);
        }
    if (!cnt) printf("No legal move.");
    printf("\n");
    return cnt;
}
void work(int x1,int y1,char s1){ //”MXX“的操作实现
    char s2=(s1=='W') ? 'B':'W';
    a[x1][y1]=s1;
    for (int i=1;i<=8;i++){
        int x=x1+dx[i],y=y1+dy[i];
        while (x>0 && x<9 && y>0 && y<9 && a[x][y]==s2){x+=dx[i];y+=dy[i];}  //Ps 感觉这两行略显冗余,但水平有限 ......
        if (x>0 && x<9 && y>0 && y<9 && a[x][y]==s1){   //确保这个方向能够”夹住“
            int x=x1+dx[i],y=y1+dy[i];
            while (x>0 && x<9 && y>0 && y<9 && a[x][y]==s2){a[x][y]=s1;x+=dx[i];y+=dy[i];}   //棋子变换
        }
    }
    int sum1=0,sum2=0;   //开始统计棋子个数
    for (int i=1;i<9;i++){
        for (int j=1;j<9;j++){
            if (a[i][j]=='W') sum2++;
            else if (a[i][j]=='B') sum1++;
        }
    }
    printf("Black -%3d White -%3d\n",sum1,sum2); //注意输出格式
}
int main(){
//    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    int t,cnt=0;
    char s1,s2;
    string s;
    cin>>t;
    while (t--) {
        getchar();
        int b[10][10]={0};
        if (cnt++) printf("\n");
        for (int i=1; i<=8; i++) {   //用char[][]数组来模拟棋盘
            for (int j=1; j<=8; j++)
                a[i][j]=getchar();
            getchar();
        }
        do{   //开始处理指令
            int cnt;
            cin>>s;
            if (s[0]=='W' || s[0]=='B'){s1=s[0];s2=(s1=='W') ? 'B':'W';}
            if (s[0]=='L'){memset(b, 0, sizeof(b));cnt=print(s1,s2,b);}
            if (s[0]=='M') {
                int x=s[1]-'0',y=s[2]-'0';
                if (!cnt) swap(s1,s2);
                work(x,y,s1);
                swap(s1,s2);
            }
        }while (s!="Q");
        for (int i=1;i<9;i++){
            for (int j=1;j<9;j++) printf("%c",a[i][j]);
            printf("\n");
        }
    }
    return 0;
}

Ps 很久没写过这么长的代码了

posted @ 2023-11-30 02:29  黑屿白  阅读(55)  评论(0)    收藏  举报