未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;
}