UVa 141 - The Spot Game

36 篇文章 0 订阅

题意实际上要求每次比较四个图形(其中三个是旋转翻转得到的),然后通过比较如果这四个图形之前都没有出现过,则将这四个图形全部存起来,以备以后进行比较(还有一点需要注意的,就是如果原图形经过旋转得到的图形和原图形相同,这种情况是不算重复的)。刚开始理解成每次几个比较完之后只把原图形存起来了,WA了好几次。方法:因为数据量较小,直接将二维图存成一维数组,然后暴力枚举比较就可以。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;
const int MAXSIZE = 2505;
int n, num, cct;
char a[52][52], b[52][52], c[405][MAXSIZE];
void Hash() // 将二维数组转化为一维数组存起来
{
    int cct = -1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            c[num][++cct] = b[i][j];
    ++num;
}
int Search()
{
    for(int k=0; k<cct; k++)
    {
        int nn = 0, ff=1;
        for(int i=1; ff&&i<=n; i++)
            for(int j=1; ff&&j<=n; j++)
                if(c[k][nn++] != b[i][j])
                {
                    ff = 0;
                    break;
                }
        if(ff)
            return 1;
    }
    return 0;
}
int main()
{
#ifdef test
    freopen("sample.txt", "r", stdin);
#endif
    int i, N, x[102], y[102];
    char str[102];
    while(scanf("%d", &n), n)
    {
        int flag = 1;
        cct = num = 0;
        memset(a, '0', sizeof(a));
        for(i=1; i<=n; i++)
            a[i][n+1] = 0;
        N = 2*n;
        for(i=1; i<=N; i++)
            scanf("%d %d %c", &x[i], &y[i], &str[i]);
        for(i=1; i<=N; i++)
        {
            if(str[i] == '+')
                a[x[i]][y[i]] = '1';
            else
                a[x[i]][y[i]] = '0';
            memcpy(b, a, sizeof(a));
            if(Search())
                break;
            Hash();
            for(int j=1; j<=n; j++)
                for(int k=1; k<=n; k++)
                    b[k][n-j+1] = a[j][k];
            if(Search())
                break;
            Hash();
            for(int j=1; j<=n; j++)
                for(int k=1; k<=n; k++)
                    b[n-k+1][j] = a[j][k];
            if(Search())
                break;
            Hash();
            for(int j=1; j<=n; j++)
                for(int k=1; k<=n; k++)
                    b[j][n-k+1] = a[j][k];
            if(Search())
                break;
            Hash();
            cct = num;
        }
        if(i % 2)
            flag = 2;
        if(i<=N)
            printf("Player %d wins on move %d\n", flag, i);
        else
            puts("Draw");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值