洛谷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 很久没写过这么长的代码了
浙公网安备 33010602011771号