您的位置:首页 > 其它

UVa 220 - Othello

2014-10-31 21:15 274 查看
昨天上毛概Ac了UVa-201之后开始想的,又是上毛概时Ac的。今天程序老师有事,除了晚自习毛概,一整天没课。上午打了会代码,中午宿舍聚餐,下午睡了会起来就发现该上晚自习了。思路还是建数组,标记棋盘。代码写了很长,原本感觉运行时间也会很长,结果Run Time仅为0.009,应该是在代码中加了很多break和提前return的缘故。虽然没超时,但感觉代码实在太长了,以后写代码尽量优化结构,让代码短一点。WA了一次因为没考虑一次落子夹住多枚的情况。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#define maxn 10
using namespace std;
char a[maxn][maxn],x;
int n,w;
char now,nex;
void get_chessboard()
{
getchar();
memset(a,0,sizeof(a));
for(int i=0;i<8;i++)
gets(a[i]);
char c=getchar();
now='W';
nex='B';
if(c=='B')
swap(now,nex);
}
int is_legal_judge(int i,int j,int u)
{
int z=0;
if(a[i-1][j-1]==nex&&i-1>=0&&j-1>=0)
{
for(int k=2;i-k>=0&&j-k>=0;k++)
{
if(a[i-k][j-k]==nex)
continue;
else if(a[i-k][j-k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i-l][j-l]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i-1][j]==nex&&i-1>=0)
{
for(int k=2;i-k>=0;k++)
{
if(a[i-k][j]==nex)
continue;
else if(a[i-k][j]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i-l][j]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i-1][j+1]==nex&&i-1>=0&&j+1<=8)
{
for(int k=2;i-k>=0&&j+k<=8;k++)
{
if(a[i-k][j+k]==nex)
continue;
else if(a[i-k][j+k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i-l][j+l]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i][j-1]==nex&&j-1>=0)
{
for(int k=2;j-k>=0;k++)
{
if(a[i][j-k]==nex)
continue;
else if(a[i][j-k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i][j-l]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i][j+1]==nex&&j+1<=8)
{
for(int k=2;j+k<=8;k++)
{
if(a[i][j+k]==nex)
continue;
else if(a[i][j+k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i][j+l]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i+1][j-1]==nex&&i+1<=8&&j-1>=0)
{
for(int k=2;i+k<=8&&j-k>=0;k++)
{
if(a[i+k][j-k]==nex)
continue;
else if(a[i+k][j-k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i+l][j-l]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i+1][j]==nex&&i+1<=8)
{
for(int k=2;i+k<=8;k++)
{
if(a[i+k][j]==nex)
continue;
else if(a[i+k][j]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i+l][j]=now;
break;
}
return 1;
}
else
break;
}
}
if(a[i+1][j+1]==nex&&i+1<=8&&j+1<=8)
{
for(int k=2;i+k<=8&&j+k<=8;k++)
{
if(a[i+k][j+k]==nex)
continue;
else if(a[i+k][j+k]==now)
{
if(u)
{
for(int l=1;l<k;l++)
a[i+l][j+l]=now;
break;
}
return 1;
}
else
break;
}
}
return z;
}
int is_legal(int is_print)
{
int p=0,first=1;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if(a[i][j]=='-')
{
if(is_legal_judge(i,j,0))
{
if(is_print)
{
if(first)
first=0;
else
cout<<" ";
cout<<"("<<i+1<<","<<j+1<<")";
}
p++;
}
}
}
}
if(p&&is_print)
cout<<endl;
else if(!p&&is_print)
cout<<"No legal move."<<endl;
return p;
}
int cnt(char l)
{
int k=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(a[i][j]==l)
k++;
return k;
}
void M()
{
int y,z;
cin>>y;
z=y%10;
y/=10;
y--;
z--;
if(!is_legal(0))
swap(now,nex);
is_legal_judge(y,z,1);
a[y][z]=now;
cout<<"Black - "<<setw(2)<<cnt('B')<<" White - "<<setw(2)<<cnt('W')<<endl;
swap(now,nex);
}
void print_chessboard()
{
for(int i=0;i<8;i++)
cout<<a[i]<<endl;
}
int main()
{
cin>>n;
while(n--)
{
get_chessboard();
char c;
while(cin>>c)
{
if(c=='L')
is_legal(1);
else if(c=='M')
M();
else if(c=='Q')
{
print_chessboard();
break;
}
}
if(n)
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: