1.跟象棋 注重运用 特定数组 实现四面八方的移动 ;
2.用 递归 寻找 是否被夹住;
部分代码 还需要 精简;
#include<cstdio>
#include<iostream>#include<cstring>
#include<algorithm>
using namespace std;
typedef struct
{
int a,b;
} ZB;
struct MM
{
ZB A;
int x[50][2],ss;
};
struct MM w[100];
int dir[8][2]= {{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
char Q[10][10];
int C[100][2],Z[100][2],h[100][2],O;
ZB zh(char m,int h,int v,int a,int b,int s)
{
ZB d;
char u=m=='W'?'B':'W';
if(!(h+a>0&&h+a<9&&b+v<9&&b+v>0))
{
d.a=d.b=0;
return d;
}
if(Q[h+a][v+b]==u)
{
Z[O][0]=h+a;
Z[O][1]=v+b;
O++;
d=zh(m,h+a,v+b,a,b,++s);
}
else if(Q[h+a][v+b]=='-')
{
if(s==0)
{
d.a=d.b=0;
return d;
}
else
{
d.a=h+a;
d.b=v+b;
return d;
}
}
else if(Q[h+a][v+b]==m)
{
d.a=d.b=0;
return d;
}
return d;
}
void sortt(int s)
{
int a,b;
for(int i=0; i<s; i++)
for(int j=i+1; j<s; j++)
{
if(h[i][0]>h[j][0])
{
a=h[i][0];
b=h[i][1];
h[i][0]=h[j][0];
h[i][1]=h[j][1];
h[j][0]=a;
h[j][1]=b;
}
else if(h[i][0]==h[j][0]&&h[i][1]>h[j][1])
{
a=h[i][0];
b=h[i][1];
h[i][0]=h[j][0];
h[i][1]=h[j][1];
h[j][0]=a;
h[j][1]=b;
}
}
}
int tol(char q)
{
int sum=0;
for(int i=1; i<=8; i++)
for(int j=1; j<=8; j++)
if(Q[i][j]==q)
{
C[sum][0]=i;
C[sum][1]=j;
sum++;
}
return sum;
}
int chr(char z,int m )
{
ZB s;
int f=0,o=0;
for(int i=0; i<m; i++)
for(int j=0; j<8; j++)
{
memset(Z,0,sizeof(Z));
O=0;
s=zh(z,C[i][0],C[i][1],dir[j][0],dir[j][1],0);
if(s.a)
{
o=0;
h[f][0]=w[f].A.a=s.a;
h[f][1]=w[f].A.b=s.b;
for(int q=0; q<O; q++)
{
w[f].x[o][0]=Z[q][0];
w[f].x[o][1]=Z[q][1];
o++;
}
w[f].ss=o;
f++;
}
}
if(!f) return 0;
sortt(f);
return f;
}
void shuchu(int s)
{
int a,b;
for(int i=0; i<s; i++)
{
if(i==0)
{
a=h[i][0];
b=h[i][1];
printf("(%d,%d)",h[i][0],h[i][1]);
}
else
{
if(a==h[i][0]&&b==h[i][1])
continue;
else
{
printf(" (%d,%d)",h[i][0],h[i][1]);
a=h[i][0];
b=h[i][1];
}
}
}
printf("\n");
}
void xia(int a,int b,int d,char c)
{
Q[a][b]=c;
for(int i=0; i<d; i++)
if(w[i].A.a==a&&w[i].A.b==b)
for(int j=0; j<w[i].ss; j++)
Q[w[i].x[j][0]][w[i].x[j][1]]=c;
}
int shu(char c)
{
int sum=0;
for(int i=1; i<=8; i++)
for(int j=1; j<=8; j++)
if(Q[i][j]==c)
sum++;
return sum;
}
int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=1; i<=8; i++)
for(int j=1; j<=8; j++)
cin>>Q[i][j];
char D[10],f;
int d;
while(cin>>D)
{
if(D[0]=='W'||D[0]=='B')
f=D[0];
if(D[0]=='M')
{
int h1,v1;
h1=D[1]-48;
v1=D[2]-48;
int sum=tol(f);
d=chr(f,sum);
if(!d)
{
char x=f=='W'?'B':'W';
int sum=tol(x);
d=chr(x,sum);
xia(h1,v1,d,x);
}
else
{
xia(h1,v1,d,f);
f=f=='W'?'B':'W';
}
int bla,whi;
bla=shu('B');
whi=shu('W');
printf("Black -%3d White -%3d\n",bla,whi);
}
if(D[0]=='L')
{
int sum=tol(f);
d=chr(f,sum);
if(!d) printf("No legal move.\n");
else shuchu(d);
}
if(D[0]=='Q')
{
for(int i=1; i<=8; i++)
{
for(int j=1; j<=8; j++)
cout<<Q[i][j];
cout<<endl;
}
break;
}
}
if(T) cout<<endl;
}
return 0;
}