UVA 141 - The Spot Game

题目大意:在一个给定大小的 n * n 的棋盘上,由玩家两方各自在棋盘上添加或删除棋子,如果当前玩家的操作使得棋盘上的棋子摆法出现了重复(前面出现过的, 包括旋转),则记该玩家失败,若未分出胜负,输出 Draw.


解题思路:借助 STL 中的 set,记录所有出现过的棋子摆法,包括旋转。

#include <cstdio>
#include <string>
#include <set>
using namespace std;

int main() {
	int n;
	while (scanf("%d", &n), n) {
		set <string> data;
		int x, y, flag = 0;
		char c, s[4][2600] = {0};

		for (int i = 0; i < 4; i++)
			for (int j = 0; j < n * n; j++)
				s[i][j] = '0';

		for (int i = 1; i <= 2 * n; i++) {
			scanf("%d%d %c", &x, &y, &c);
			int spot = (c == '+' ? '1' : '0');
			x--, y--;

			s[0][x * n + y] = spot;
			s[1][y * n + (n - x - 1)] = spot;
			s[2][(n - y - 1) * n + x] = spot;
			s[3][(n - x - 1) * n + (n - y - 1)] = spot;

			if (data.find(s[0]) != data.end() && !flag)
				flag = i;

			for (int i = 0; i < 4; i++)
				data.insert(s[i]);
		}

		if (flag)
			printf("Player %d wins on move %d\n", flag % 2 + 1, flag);
		else
			printf("Draw\n");	
	}
	return 0;
}


你可能感兴趣的:(UVA 141 - The Spot Game)