UVa 141 - The Spot Game

题意实际上要求每次比较四个图形(其中三个是旋转翻转得到的),然后通过比较如果这四个图形之前都没有出现过,则将这四个图形全部存起来,以备以后进行比较(还有一点需要注意的,就是如果原图形经过旋转得到的图形和原图形相同,这种情况是不算重复的)。刚开始理解成每次几个比较完之后只把原图形存起来了,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; }

你可能感兴趣的:(c,search,图形)