syhd142 |
|
|||
日歷
統計
導航常用鏈接留言簿(2)隨筆檔案(23)文章分類(270)
文章檔案(122)我的豆瓣搜索最新評論
閱讀排行榜
評論排行榜 |
兩個人在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; }
|
![]() |
|
Copyright © Fucker | Powered by: 博客園 模板提供:滬江博客 |