心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意是:在一个n×n棋盘上不断执行加入棋子或移除棋子的操作,判断在哪一步出现了之前出现过的局面(通过旋转可以得到的认为是同一个局面)。
用一个set来存储已经出现过的局面,每次得到一个新局面,把这个新局面的各种旋转一起加入到set中。
以下是我的代码:
#include<set>
#include
<cstdio>
#include
<cstring>
using namespace std;
const int kMaxn(57);

int n;

struct Type
{
    
bool r[kMaxn][kMaxn];
};
bool operator<(const Type &a,const Type &b)
{
    
for(int i=1;i<=n;i++)
        
for(int j=1;j<=n;j++)
            
if(a.r[i][j]<b.r[i][j])
                
return true;
            
else if(a.r[i][j]>b.r[i][j])
                
return false;
    
return false;
}

void rotate(Type &x)
{
    Type t;
    
for(int i=1;i<=n;i++)
        
for(int j=1;j<=n;j++)
            t.r[j][n
-i+1]=x.r[i][j];
    x
=t;
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif

    
while(scanf("%d",&n)==1 && n)
    {
        
int ans(-1);
        Type g;
        
set<Type> used;
        memset(g.r,
false,kMaxn*kMaxn*sizeof(bool));

        
for(int i=1;i<=2*n;i++)
        {
            
int x,y;
            
char ch;
            scanf(
"%d%d %c",&x,&y,&ch);
            
if(ans!=-1)
                
continue;
            
if(ch=='+')
                g.r[x][y]
=true;
            
else
                g.r[x][y]
=false;
            
if(used.count(g))
            {
                ans
=i;
                
continue;
            }
            Type t(g);
            
for(int j=1;j<=4;j++)
            {
                used.insert(t);
                rotate(t);
            }
        }

        
if(ans==-1)
            printf(
"Draw\n");
        
else if(ans&1)
            printf(
"Player 2 wins on move %d\n",ans);
        
else
            printf(
"Player 1 wins on move %d\n",ans);
    }

    
return 0;
}
posted on 2011-05-09 11:40 lee1r 阅读(845) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:基础/模拟题目分类:数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理