两个人在N*N的棋盘上玩游戏,每次允许放和拿走一个棋子,如果这样操作出现的局面和之前的局面重复,那么久输了。
重复的局面包括向左右的90°翻转和向上下180°的翻转。
#include <stdio.h>
#include <string.h>
#define N 51
bool g[505][N][N], G[N][N];
int top;
bool compare(int k, int n)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(g[k][i][j] != G[i][j])
{
return 0;
}
return 1;
}
bool map(int x, int y, char op, int n)
{
for(int k = 0; k < top; k++)
{
if(compare(k, n)) return 1;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[top][i][j] = G[i][j];
top++;
//turn left
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[top][i][j] = G[n - j - 1][n - i - 1];
top++;
//turn right
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[top][i][j] = G[j][i];
top++;
//turn horizonl
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[top][i][j] = G[i][n - j - 1];
top++;
//turn vertical
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
g[top][i][j] = G[n - i - 1][j];
top++;
return 0;
}
int main()
{
int n, x, y, mk;
char op[5];
while(scanf("%d", &n), n)
{
top = mk = 0;
memset(G, 0, sizeof(G));
memset(g, 0, sizeof(g));
for(int i = 0; i < 2 * n; i++)
{
scanf("%d %d %s", &x, &y, &op);
x--, y--;
if(op[0] == '+') G[x][y] = 1;
else G[x][y] = 0;
if(mk) continue;
if(map(x, y, op[0], n))
{
mk = 1;
printf("Player %d wins on move %d\n", (i & 1) ? 1 : 2, i + 1);
}
}
if(!mk) printf("Draw\n");
}
return 0;
}