The Spot Game 

The game of Spot is played on an NxN board as shown below for N = 4. During the game, alternate players may either place a black counter (spot) in an empty square or remove one from the board, thus producing a variety of patterns. If a board pattern (or its rotation by 90 degrees or 180 degrees) is repeated during a game, the player producing that pattern loses and the other player wins. The game terminates in a draw after 2N moves if no duplicate pattern is produced before then.

Consider the following patterns:

If the first pattern had been produced earlier, then any of the following three patterns (plus one other not shown) would terminate the game, whereas the last one would not.

Input and Output

Input will consist of a series of games, each consisting of the size of the board, N (2  N  50) followed, on separate lines, by 2N moves, whether they are all necessary or not. Each move will consist of the coordinates of a square (integers in the range 1..N) followed by a blank and a character `+' or `-' indicating the addition or removal of a spot respectively. You may assume that all moves are legal, that is there will never be an attempt to place a spot on an occupied square, nor to remove a non-existent spot. Input will be terminated by a zero (0).

Output will consist of one line for each game indicating which player won and on which move, or that the game ended in a draw.

Sample input

2
1 1 +
2 2 +
2 2 -
1 2 +
2
1 1 +
2 2 +
1 2 +
2 2 -
0

Sample output

Player 2 wins on move 3
Draw

题意:给定一个n*n的棋盘, 然后玩家1和玩家2每人轮操作棋子(可以放一个棋子或者拿掉一个棋子)。进行n次。。。然后如果某一个玩家进行一次操作之后。棋盘出现之前出现过的局面,这另外一位玩家获得胜利。。如果放完没人胜利,输出Draw。 注意,棋盘是可以旋转的,看题目中前4副图,代表的都是相同的局面。。

思路:放了棋子的点为1,没放的为0,把每个局面,,保存成一个字符串,,每次放完棋子之后。旋转4次。4种情况都插入到一个set。。如果一个玩家放完棋子后的局面。在set里面可以找到,则这个玩家失败,另一个玩家胜利。。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <set>
using namespace std; int n;
int map[55][55];
char save[4][2555];
int x, y;
char c;
set<string> adj;
void sav()
{
memset(save, 0 , sizeof(save));
int t;
t = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
{
save[0][t ++] = map[i][j] + '0';
}
save[0][t] = '\0';
t = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
{
save[1][t ++] = map[j][n + 1 - i] + '0';
}
save[1][t] = '\0';
t = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
{
save[2][t ++] = map[n + 1 - i][n + 1 - j] + '0';
}
save[2][t] = '\0';
t = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
{
save[3][t ++] = map[n + 1 - j][i] + '0';
}
save[3][t] = '\0';
}
int main()
{
while (~scanf("%d", &n) && n)
{
int judge = 0;
int bu = 0;
memset(map, 0 , sizeof(map));
adj.clear();
for (int i = 0; i < 2 * n; i ++)
{
scanf("%d%*c%d%*c%c%*c", &x, &y, &c);
if (c == '+')
map[x][y] = 1;
if (c == '-')
map[x][y] = 0;
sav();
for (int j = 0; j < 4; j ++)
{
if (adj.find(save[j]) != adj.end())
{
judge = 1;
break;
}
}
for (int j = 0 ; j < 4; j ++)
adj.insert(save[j]);
if (judge)
{
if (bu == 0)
bu = i + 1;
}
}
if (judge)
{
if (bu % 2)
printf("Player 2 wins on move %d\n", bu);
else
printf("Player 1 wins on move %d\n", bu);
}
else
printf("Draw\n");
}
return 0;
}

UVA 141 The Spot Game 斑点游戏。。的更多相关文章

  1. UVa 340 Master-Mind Hints(猜数字游戏的提示)

    题意  猜数字游戏  统计猜的数字有多少个数字位置正确  有多少个数字在答案中出现可是位置不对  每一个字符仅仅能匹配一次 直接匹配每位数 #include<cstdio> #includ ...

  2. UVA 340 Master-Mind Hints 猜密码游戏(水)

    题意: 给一串密码(第一行),接着再给你很多行猜测,针对每行猜测,输出两个数字,分表代表:同一列上匹配的个数,不同列上匹配的个数.注:匹配指的是一次,一旦配对,不能再与其他配对. 思路: 每接受一行猜 ...

  3. UVA - 1610 Party Games(聚会游戏)(构造)

    题意:输入一个n(2<=n<=1000,n是偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中恰好一半串小于等于S,另一半串大于S.如果有多解,输出字典序最小的 ...

  4. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  5. .Uva&LA部分题目代码

    1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...

  6. 新概念英语三 新东方主讲Lesson1

    新概念二 Lesson95 词汇 ①get a shock 吓了一跳,得到一个惊喜 例:his wife got a shock get into a such mess 这么不幸搞得一片狼籍弄得这样 ...

  7. 09_Sum游戏(UVa 10891 Game of Sum)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P67 例题28: 问题描述:有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取,每次可以从左端或者右端取一个或多个数,但不能两端 ...

  8. uva 1378 - A Funny Stone Game(组合游戏)

    题目链接:uva 1378 - A Funny Stone Game 题目大意:两个人玩游戏,对于一个序列,轮流操作.每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,对应 ...

  9. uva 1567 - A simple stone game(K倍动态减法游戏)

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=4342">题目链接:uva 1567 - ...

随机推荐

  1. 使用 CodeIgniter 框架快速开发 PHP 应用(六)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(六) 简化使用 Session 和安全理论说得够多了! 现在让我们开始写我们自己的应用. 在这一章里,我们将会大致描述一下我们要建立的一 ...

  2. HttpGet 请求

    import java.net.HttpURLConnection; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  3. BNUOJ 34981 A Matrix

    BNUOJ 34981 A Matrix 题目地址:pid=34981" style="color:rgb(0,136,204); text-decoration:none&quo ...

  4. 堆C数组实现

    堆栈是一个最后出来该数据结构. 栈的基本操作包含:入栈,出栈,初始化栈,清空栈,遍历栈. C代码例如以下: #include <stdio.h> #define MaxSize 20 ty ...

  5. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  6. Socket 学习(三).2 udp 穿透 服务端 与 客户端 通讯

    之前演示的 是 局域网通讯,也可以用作服务器之间的通讯,不能穿透. 想要穿透就要用 udp 了, 后续再讲解 udp 打洞 . 客户端: using System; using System.Wind ...

  7. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  8. Windows 7的 磁盘管理中,某个磁盘或分区,突然变成只读。

    1.今天突然发现E盘无法创建文件夹.文件,也不可以改,感觉像是变成只读 . 2.我的电脑 -> 计算机管理 -> 存储 -> 磁盘管理,发现E盘下面标记着只读两个字. 3.由于我的E ...

  9. Samba(一)通过Samba搭建Linux文件服务器

    本文的目的是为了快速搭建一个linux文件服务器,主要是便于局域网电脑可以方便快速的获得Linux服务器共享的文档(非互传) samba是一个功能十分强大的软件,今天是我们的主角,因为本文是一个演示实 ...

  10. Asterisk 未来之路3.0_0004

    原文:Asterisk 未来之路3.0_0004 Asterisk Wiki   asterisk 的Wiki是很多启迪和困惑的发源地,另外一个最重要的VOIP知识库www.voip-info.org ...