uva 220 Othello
阿新 • • 發佈:2019-02-08
未A,但是測試了好多資料,沒有找出錯誤。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; using namespace std; char board[10][10]; char FirstStep; int adj[9][9]; int countW=0,countB=0; int num=0; int n; //存放合法路徑 typedef struct{ int x,y; int size; }legalmove; legalmove moves[1005]; //讀取棋盤 void ReadBoard() { for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { cin>>board[i][j]; } } cin>>FirstStep; } //往上找符合條件的位置 void L_up(int i,int j,char ch,char c) { int cnt=0; for(int k=i-1;k>=1;k--) { if(board[k][j]==c) cnt++; if(board[k][j]=='-'&&cnt) { moves[moves->size].x=k; moves[moves->size].y=j; moves->size++; break; } if(!cnt&&board[k][j]=='-') break; if(board[k][j]==ch) break; } } //往下找符合條件的位置 void L_down(int i,int j,char ch,char c) { int cnt=0; for(int k=i+1;k<=8;k++) { if(board[k][j]==c) cnt++; if(board[k][j]=='-'&&cnt) { moves[moves->size].x=k; moves[moves->size].y=j; moves->size++; break; } if(!cnt&&board[k][j]=='-') break; if(board[k][j]==ch) break; } } //往左找符合條件的位置 void L_left(int i,int j,char ch,char c) { int cnt=0; for(int k=j-1;k>=1;k--) { if(board[i][k]==c) cnt++; if(board[i][k]=='-'&&cnt) { moves[moves->size].x=i; moves[moves->size].y=k; moves->size++; break; } if(!cnt&&board[i][k]=='-') break; if(board[i][k]==ch) break; } } //往右找符合條件的位置 void L_right(int i,int j,char ch,char c) { int cnt=0; for(int k=j+1;k<=8;k++) { if(board[i][k]==c) cnt++; if(board[i][k]=='-'&&cnt) { moves[moves->size].x=i; moves[moves->size].y=k; moves->size++; break; } if(!cnt&&board[i][k]=='-') break; if(board[i][k]==ch) break; } } //往左上找符合條件的位置 void L_upandleft(int i,int j,char ch,char c) { int cnt=0; for(int k=1;i-k>=1&&j-k>=1;k++) { if(board[i-k][j-k]==c) cnt++; if(board[i-k][j-k]=='-'&&cnt) { moves[moves->size].x=i-k; moves[moves->size].y=j-k; moves->size++; break; } if(!cnt&&board[i-k][j-k]=='-') break; if(board[i-k][j-k]==ch) break; } } //往右上找符合條件的位置 void L_upandright(int i,int j,char ch,char c) { int cnt=0; for(int k=1;i-k>=1&&j+k<=8;k++) { if(board[i-k][j+k]==c) cnt++; if(board[i-k][j+k]=='-'&&cnt) { moves[moves->size].x=i-k; moves[moves->size].y=j+k; moves->size++; break; } if(!cnt&&board[i-k][j+k]=='-') break; if(board[i-k][j+k]==ch) break; } } //往左下找符合條件的位置 void L_downandleft(int i,int j,char ch,char c) { int cnt=0; for(int k=1;i+k<=8&&j-k>=1;k++) { if(board[i+k][j-k]==c) cnt++; if(board[i+k][j-k]=='-'&&cnt) { moves[moves->size].x=i+k; moves[moves->size].y=j-k; moves->size++; break; } if(!cnt&&board[i+k][j-k]=='-') break; if(board[i+k][j-k]==ch) break; } } //往右下找符合條件的位置 void L_downandright(int i,int j,char ch,char c) { int cnt=0; for(int k=1;i+k<=8&&j+k<=8;k++) { if(board[i+k][j+k]==c) cnt++; if(board[i+k][j+k]=='-'&&cnt) { moves[moves->size].x=i+k; moves[moves->size].y=j+k; moves->size++; break; } if(!cnt&&board[i+k][j+k]=='-') break; if(board[i+k][j+k]==ch) break; } } void sortmoves() { for(int i=1;i<=8;i++) memset(adj[i],0,sizeof(adj[i])); for(int i=0;i<moves->size;i++) adj[moves[i].x][moves[i].y]=1; } void listlegalmoves() { if(moves->size==0) printf("No legal move.\n"); else { for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { if(adj[i][j]) printf("(%d,%d)",i,j); } } printf("\n"); } } //如果命令是L void Cmd_isL(char ch) { char c; if(ch=='W') c='B'; else c='W'; for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { if(board[i][j]==ch) { L_up(i,j,ch,c); L_down(i,j,ch,c); L_left(i,j,ch,c); L_right(i,j,ch,c); L_upandleft(i,j,ch,c); L_upandright(i,j,ch,c); L_downandleft(i,j,ch,c); L_downandright(i,j,ch,c); } } } sortmoves(); listlegalmoves(); } //把上面的棋子變色 void changecolor_up(int a,int b,char ch,char c) { int k; for(k=a-1;k>=1;k--) { if(board[k][b]==ch) break; if(board[k][b]=='-') return ; if(k==1) return ; } if(k!=a-1) { for(int i=a-1;i>k;i--) board[i][b]=ch; } } //把下面的棋子變色 void changecolor_down(int a,int b,char ch,char c) { int k; for(k=a+1;k<=8;k++) { if(board[k][b]==ch) break; if(board[k][b]=='-') return ; if(k==8) return ; } if(k!=a+1) { for(int i=a+1;i<k;i++) board[i][b]=ch; } } //把左邊的棋子變色 void changecolor_left(int a,int b,char ch,char c) { int k; for(k=b-1;k>=1;k--) { if(board[a][k]==ch) break; if(board[a][k]=='-') return ; if(k==1) return ; } if(k!=b-1) { for(int i=b-1;i>k;i--) board[a][i]=ch; } } //把右邊的棋子變色 void changecolor_right(int a,int b,char ch,char c) { int k; for(k=b+1;k<=8;k++) { if(board[a][k]==ch) break; if(board[a][k]=='-') return ; if(k==8) return ; } if(k!=b+1) { for(int i=b+1;i<k;i++) board[a][i]=ch; } } //把左上的棋子變色 void changecolor_upandleft(int a,int b,char ch,char c) { int k; for(k=1;a-k>=1&&b-k>=1;k++) { if(board[a-k][b-k]==ch) break; if(board[a-k][b-k]=='-') return ; if(a-k==1||b-k==1) return ; } for(int i=1;i<k;i++) board[a-i][b-i]=ch; } //把右上的棋子變色 void changecolor_upandright(int a,int b,char ch,char c) { int k; for(k=1;a-k>=1&&b+k<=8;k++) { if(board[a-k][b+k]==ch) break; if(board[a-k][b+k]=='-') return ; if(a-k==1||b+k==8) return ; } for(int i=1;i<k;i++) board[a-i][b+i]=ch; } //把左下的棋子變色 void changecolor_downandleft(int a,int b,char ch,char c) { int k; for(k=1;a+k<=8&&b-k>=1;k++) { if(board[a+k][b-k]==ch) break; if(board[a+k][b-k]=='-') return; if(a+k==8||b-k==1) return ; } for(int i=1;i<k;i++) board[a+i][b-i]=ch; } //把右下的棋子變色 void changecolor_downandright(int a,int b,char ch,char c) { int k; for(k=1;a+k<=8&&b+k<=8;k++) { if(board[a+k][b+k]==ch) break; if(board[a+k][b+k]=='-') return ; if(a+k==8||b+k==8) return ; } for(int i=1;i<k;i++) board[a+i][b+i]=ch; } //把夾住的棋子變色 void changecolor(int a,int b,char ch,char c) { changecolor_up(a,b,ch,c); changecolor_down(a,b,ch,c); changecolor_left(a,b,ch,c); changecolor_right(a,b,ch,c); changecolor_upandleft(a,b,ch,c); changecolor_upandright(a,b,ch,c); changecolor_downandleft(a,b,ch,c); changecolor_downandright(a,b,ch,c); } //數黑白棋個數 void count_WandB() { for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { if(board[i][j]=='W') countW++; if(board[i][j]=='B') countB++; } } } //如果命令是M char Cmd_isM(char ch,int a,int b) { int cnt=0; for(int i=0;i<moves->size;i++) { if(moves[i].x==a&&moves[i].y==b) cnt++; } if(!cnt) { if(ch=='W') ch='B'; else ch='W'; } board[a][b]=ch; char c; if(ch=='W') c='B'; else c='W'; changecolor(a,b,ch,c); count_WandB(); printf("Black-%2dWhite-%2d\n",countB,countW); return ch; } //如果命令是Q void Cmd_isQ() { for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { printf("%c",board[i][j]); } printf("\n"); } printf("\n"); } int main() { scanf("%d",&n); while(n--) { moves->size=0; countW=0; countB=0; string cmd; char ch; ReadBoard(); cin>>cmd; ch=FirstStep; while(cmd[0]!='Q') { if(cmd[0]=='L') Cmd_isL(ch); if(cmd[0]=='M') { ch=Cmd_isM(ch,cmd[1]-'0',cmd[2]-'0'); if(ch=='W') ch='B'; else ch='W'; moves->size=0; countW=0; countB=0; } cin>>cmd; } if(cmd[0]=='Q') Cmd_isQ(); } return 0; }