哈哈,非常独立的完成了这个题目,虽然WA了好几次,但是独立嘛,好的开始,要坚持!
这个题主要是状态的保存,因为要判断之前是否出现过,所以把每次移动后的状态用map<string ,int>保存的,(某一点有棋子用‘2’表示,没有用‘1’表示,然后转化成字符串,string类),比较奇怪的是,两种保存状态都AC了:
1:只保存每次移动后的状态
这个题主要是状态的保存,因为要判断之前是否出现过,所以把每次移动后的状态用map<string ,int>保存的,(某一点有棋子用‘2’表示,没有用‘1’表示,然后转化成字符串,string类),比较奇怪的是,两种保存状态都AC了:
1:只保存每次移动后的状态
2:保存每次移动后的状态,以及顺时针旋转90度,逆时针旋转90度,旋转180度后的状态。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<map>
using namespace std;
char maze[105][105];
int n;
map<string,int>vis;
string change(int i)
{
string s;
if(i==0)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<n; k++)
s+=maze[j][k];
}
}
else if(i==1)
{
for(int k=0; k<n; k++)
{
for(int j=n-1; j>=0; j--)
s+=maze[j][k];
}
}
else if(i==2)
{
for(int j=n-1; j>=0; j--)
{
for(int k=n-1; k>=0; k--)
s+=maze[j][k];
}
}
else if(i==3)
{
for(int j=n-1; j>=0; j--)
{
for(int k=0; k<n; k++)
s+=maze[k][j];
}
}
return s;
}
int main()
{
//freopen("in.txt","r",stdin);
int x,y,i,player;
char c;
while(scanf("%d",&n)!=EOF&&n)
{
vis.clear();
memset(maze,'1',sizeof(maze));
string s;
for(i=0; i<n; i++)
{
for(int j=0; j<n; j++)
s+=maze[i][j];
}
vis[s]=1;
int flag=0;
int step;
for( i=0; i<2*n; i++)
{
scanf("%d %d %c\n",&x,&y,&c);
if(flag) continue;
if(c=='+')
maze[x-1][y-1]='2';
else if(c=='-')
maze[x-1][y-1]='1';
string ss[4];
for(int j=0; j<4; j++)
{
ss[j]=change(j);
if(vis[ss[j]]!=0)
{
flag=1;
step=i+1;
player=i;
break;
}
}
if(!flag)
{
for(int j=0; j<4; j++)
vis[ss[j]]=1;
//vis[ss[0]]=1;
}
}
if(flag)
{
if(player%2==0)
player=2;
else player=1;
printf("Player %d wins on move %d\n",player,step);
}
else cout<<"Draw"<<endl;
}
return 0;
}