您的位置:首页 > 其它

UVa 141 - The Spot Game

2012-10-19 22:02 369 查看
题意实际上要求每次比较四个图形(其中三个是旋转翻转得到的),然后通过比较如果这四个图形之前都没有出现过,则将这四个图形全部存起来,以备以后进行比较(还有一点需要注意的,就是如果原图形经过旋转得到的图形和原图形相同,这种情况是不算重复的)。刚开始理解成每次几个比较完之后只把原图形存起来了,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  search 图形 c