UVa-220 Othello
以前做的题,写的极丑,肯定可以优化,但是做过的题不想再看了,直接粘代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
bool judge(int x,int y,char b,char d);
void m(int x,int y,char b,char d);
char a[10][10]={};
void change(char &a,char &b);
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
cin>>n;
while(n--)
{
memset(a,0,sizeof(a));
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cin>>a[i][j];
}
}
char b,d;
cin>>b;
b=='W'?d='B':d='W';
char c;
while(cin>>c)
{
bool f=0;
if(c=='L')
{
int cnt=0;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
if(a[i][j]=='-')
{
if(judge(i,j,b,d))
{
f=1;
if(cnt==0)
printf("(%d,%d)",i,j);
else
printf(" (%d,%d)",i,j);
cnt++;
}
}
}
}
if(f==0)
{
printf("No legal move.");
}
}
else if(c=='M')
{
int num,i,j,sumb=0,sumw=0;
cin>>num;
i=num/10,j=num%10;
if(judge(i,j,b,d))
{
a[i][j]=b;
m(i,j,b,d);
}
else
{
change(b,d);
a[i][j]=b;
m(i,j,b,d);
}
change(b,d);
for(int ii=1;ii<=8;ii++)
{
for(int jj=1;jj<=8;jj++)
{
if(a[ii][jj]=='B')
{
sumb++;
}
else if(a[ii][jj]=='W')
{
sumw++;
}
}
}
printf("Black - %2d White - %2d",sumb,sumw);
}
else if(c=='Q')
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
printf("%c",a[i][j]);
}
printf("\n");
}
break;
}
printf("\n");
}
if(n>0)
printf("\n");
}
}
bool judge(int x,int y,char b,char d)
{
if(a[x][y]!='-')
return 0;
bool f1=0,f2=0;
for(int j=y+1;a[x][j]!='\0';j++)
{
if(a[x][j]==d)
{
f1=1;
continue;
}
else if(a[x][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int j=y-1;a[x][j]!='\0';j--)
{
if(a[x][j]==d)
{
f1=1;
continue;
}
else if(a[x][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x-1;a[i][y]!='\0';i--)
{
if(a[i][y]==d)
{
f1=1;
continue;
}
else if(a[i][y]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x+1;a[i][y]!='\0';i++)
{
if(a[i][y]==d)
{
f1=1;
continue;
}
else if(a[i][y]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x+1,j=y+1;a[i][j]!='\0';i++,j++)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x-1,j=y-1;a[i][j]!='\0';i--,j--)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x-1,j=y+1;a[i][j]!='\0';i--,j++)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
f1=f2=0;
for(int i=x+1,j=y-1;a[i][j]!='\0';i++,j--)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
return 1;
}
return 0;
}
void m(int x,int y,char b,char d)
{
int xx,yy;
bool f1=0,f2=0;
for(int j=y+1;a[x][j]!='\0';j++)
{
if(a[x][j]==d)
{
f1=1;
continue;
}
else if(a[x][j]==b)
{
xx=x;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int j=y+1;j<yy;j++)
{
a[xx][j]=b;
}
}
f1=f2=0;
for(int j=y-1;a[x][j]!='\0';j--)
{
if(a[x][j]==d)
{
f1=1;
continue;
}
else if(a[x][j]==b)
{
xx=x;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int j=y-1;j>yy;j--)
{
a[xx][j]=b;
}
}
f1=f2=0;
for(int i=x-1;a[i][y]!='\0';i--)
{
if(a[i][y]==d)
{
f1=1;
continue;
}
else if(a[i][y]==b)
{
xx=i;
yy=y;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x-1;i>xx;i--)
{
a[i][yy]=b;
}
}
f1=f2=0;
for(int i=x+1;a[i][y]!='\0';i++)
{
if(a[i][y]==d)
{
f1=1;
continue;
}
else if(a[i][y]==b)
{
xx=i;
yy=y;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x+1;i<xx;i++)
{
a[i][yy]=b;
}
}
f1=f2=0;
for(int i=x+1,j=y+1;a[i][j]!='\0';i++,j++)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
xx=i;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x+1,j=y+1;(i<xx)&&(j<yy);i++,j++)
{
a[i][j]=b;
}
}
f1=f2=0;
for(int i=x-1,j=y-1;a[i][j]!='\0';i--,j--)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
xx=i;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x-1,j=y-1;(i>xx)&&(j>yy);i--,j--)
{
a[i][j]=b;
}
}
f1=f2=0;
for(int i=x-1,j=y+1;a[i][j]!='\0';i--,j++)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
xx=i;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x-1,j=y+1;(i>xx)&&(j<yy);i--,j++)
{
a[i][j]=b;
}
}
f1=f2=0;
for(int i=x+1,j=y-1;a[i][j]!='\0';i++,j--)
{
if(a[i][j]==d)
{
f1=1;
continue;
}
else if(a[i][j]==b)
{
xx=i;
yy=j;
f2=1;
break;
}
else
{
f1=f2=0;
break;
}
}
if(f1&&f2)
{
for(int i=x+1,j=y-1;(i<xx)&&(j>yy);i++,j--)
{
a[i][j]=b;
}
}
}
void change(char &a,char &b)
{
char t;
t=a;
a=b;
b=t;
}