UVA - 141 The Spot Game

来源:互联网 发布:新淘宝店铺转让价格表 编辑:程序博客网 时间:2024/06/05 07:37

题目大意:给出一个 N 表示 N×N 的棋盘,以下 2N 行每行表示一个人的操作,两个人轮流,数字表示操作的位置,+ 表示放一个点,- 表示取一个点,当棋盘重复(旋转90、180、270后相同的就算重复)时,当前操作的人失败。若 2N 步后无胜负则平局。
解题思路:step 表示棋盘状态,根据操作来改变,因为 N 最大 50 开个[2][50+5] 就行,将这个二维数组映射到一维数组 sta,方便判重,每改变一次棋盘都拿当前棋盘和旋转后的各个情况去判断,而 map 只要保存其中一种状况就可以。

#include<iostream> #include<cstdio>#include<cmath>#include<string.h>#include<stdlib.h>#include<algorithm>#include<queue>#include<map>using namespace std;map<string, bool> m;char sta[110];int step[2][55];int t, flag, N;bool ok() {    int i, j, n, k, t;    for (i = j = n = 0; i < N<<1; i++) {        sta[i] = step[n][j++]+1;        if (j >= N) {j = 0; n++;}    }    if (m[sta]) return 1;    for (i = j = 0, t = n = 1; i < N<<1; i++) {        sta[i] = step[n][j]+1;        j += t;        if (j >= N) {j = N-1; n--; t = -1;}    }    if (m[sta]) return 1;    for (i = n = 0, j = N-1; i < N<<1; i++) {        sta[i] = step[n][j--]+1;        if (j < 0) {j = N-1; n++;}    }    if (m[sta]) return 1;    for (i = 0, j = N-1, t = -1, n = 1; i < N<<1; i++) {        sta[i] = step[n][j]+1;        j += t;        if (j < 0) {j = 0; n--; t = 1;}    }    if (m[sta]) return 1;    else m[sta] = 1;    return 0;}int main() {    while (scanf("%d", &N) && N) {        m.clear();        memset(step, 0, sizeof(step));        flag = 0;        int a, b;        char c;        for (int i = 0; i < N<<1; i++) {            scanf("%d%d %c", &a, &b, &c);            if (flag) continue;            if (c == '-') t = -1;            else t = 1;            step[0][a-1] += t;            step[1][b-1] += t;            if (ok()) {                printf("Player %d wins on move %d\n", (i+1)%2+1, i+1);                flag = 1;            }        }        if (!flag) printf("Draw\n");    }return 0;}
0 0
原创粉丝点击