UVa 141 - The Spot Game

题目:给你一个n*n的表格,两个人轮流进行操作,每次在一个位置放上或者拿下一个棋子;

如果某一状态,之前出现过,则对方获胜,问谁获胜,如果没人获胜,输出Draw。

分析:DS,数据结构,hash函数,状态压缩。

将每一行存到一个位中,用一个一维数组表示一个状态,然后利用hash表存储查找即可。

说明:注意旋转后的状态认为是相同的。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

//hash_define
typedef struct node0
{
	long  A[50];
	node0 *next;
}hnode;
hnode* hash_head[100];
hnode  hash_node[100];
int    hash_size;

void hash_init()
{
	hash_size = 0;
	memset(hash_node, 0, sizeof(hash_node));
	memset(hash_head, 0, sizeof(hash_head));
}

void copy(int a[][50], int b[][50], int n)
{
	for (int i = 0 ; i < n ; ++ i)
	for (int j = 0 ; j < n ; ++ j)
		a[i][j] = b[i][j];
}

void over(int a[][50], int b[][50], int n)
{
	for (int i = 0 ; i < n ; ++ i)
	for (int j = 0 ; j < n ; ++ j)
		a[j][i] = b[n-1-i][j];
}

int tem1[50][50],tem2[50][50];
int hash_insert(int a[][50], int n)
{
	copy(tem1, a, n);
	int sum = 0;
	for (int k = 0 ; k < 4 ; ++ k) {
		over(tem2, tem1, n);
		copy(tem1, tem2, n);
		sum = 0;
		for (int i = 0 ; i < n ; ++ i) {
			hash_node[hash_size].A[i] = 0;
			for (int j = 0 ; j < n ; ++ j) {
				hash_node[hash_size].A[i] += tem2[i][j]<<j;
				sum = (sum+tem2[i][j])%100;
			}
		}
		for (hnode* p = hash_head[sum] ; p ; p = p->next) {
			int flag = 0;
			for (int i = 0 ; i < n ; ++ i)
				if (p->A[i] != hash_node[hash_size].A[i]) {
					flag = 1;break;
				}
			if (!flag) return 1;
		}
	}
	hash_node[hash_size].next = hash_head[sum];
	hash_head[sum] = &hash_node[hash_size ++];
	return 0;
}
//hash_end

int maps[50][50];

int main()
{
	int  n,x,y;
	char ch;
	while (~scanf("%d",&n) && n) {
		memset(maps, 0, sizeof(maps));
		hash_init();
		int flag = 0;
		for (int i = 1 ; i <= 2*n ; ++ i) {
			scanf("%d %d %c",&x,&y,&ch);
			if (ch == '+') {
				if (maps[x-1][y-1] && !flag)
					flag = i;
				else maps[x-1][y-1] = 1;
			}else {
				if (!maps[x-1][y-1] && !flag)
					flag = i;
				else maps[x-1][y-1] = 0;
			}
			if (hash_insert(maps, n) && !flag)
				flag = i;
		}
		if (!flag) printf("Draw\n");
		else printf("Player %d wins on move %d\n",1+flag%2,flag);
	}
    return 0;
}
时间: 2024-10-25 17:36:32

UVa 141 - The Spot Game的相关文章

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

[题解]UVa 12661 Funny Car Racing - spfa

很简单的一道最短路问题.分情况处理赛道的打开和关闭. Code 1 /** 2 * UVa 3 * Problem#12661 4 * Accepted 5 * Time:50ms 6 */ 7 #include<iostream> 8 #include<fstream> 9 #include<sstream> 10 #include<cstdio> 11 #include<cstdlib> 12 #include<cstring>

[题解]UVa 11082 Matrix Decompressing

开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且题目中然而并没有什么要求,所以说可以考虑思考一下这道题有木有什么"套路"之类的通法) 比如说有这么一组数据 原矩阵 1 2 3 4 7 8 9 5 6 输入 3 3 6 25 45 14 28 45 然后将每一行的和写在每一列对应的行上(很明显有问题) 6 0 0 19 0 0 20 0

[uva] 10099 - The Tourist Guide

10099 - The Tourist Guide 题目页:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1040 Mr.G.自己也算一个人……… 反映到代码里是127行 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

uva 11374

Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more quickly than other transports. There are two types of trains in Airport-Express, the Economy-Xpress and the Commercial-Xpres

[题解]uva 1658 Admiral

vjudge传送门[here] 题目大意:给一个有(3≤v≤1000)个点e(3≤e≤10000)条边的有向加权图,求1~v的两条不相交(除了起点和终点外没有公共点)的路径,使权值和最小. 正解是吧2到v-1的每个点拆成两个点,中间连一条容量为1,费用为0的边,然后求1到v的流量为2的最小费用流就行了. Code 1 /** 2 * Uva 3 * Problem#1658 4 * Accepted 5 */ 6 #include<iostream> 7 #include<cstdio&

UVA 11324 The Largest Clique (强连通分量缩点,图DP)

题目: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2299 题意: 给你一个有向图,求一个点集合的最大大小,使得此点集合中对于任意点对(u,v),有从u到v或者从v到u的边 方法: 先找强连通分量缩点,每个强连通分量显然满足条件,然后在缩点后的图中找到一条权值最大的路径,权值为此路径的点权之和,点权为这个

Ananagrams UVA 156

题目: Ananagrams Most crossword puzzle fans are used to anagrams--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this attribute, no matter how you rearrange their l