UVA 141 - The Spot Game

来源:互联网 发布:c语言实战演练 编辑:程序博客网 时间:2024/05/20 13:14
           哈哈,非常独立的完成了这个题目,虽然WA了好几次,但是独立嘛,好的开始,要坚持!
         这个题主要是状态的保存,因为要判断之前是否出现过,所以把每次移动后的状态用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;}

原创粉丝点击