POJ 1021 2D-Nim
Description
The player on move may remove (A), (B), (A, B), (A, B, C), or (B,F), etc., but may not remove (A, C), (D, E), (H, I) or (B, G).
For purposes of writing 2D-Nim-playing software, a certain programmer wants to be able to tell whether or not a certain position has ever been analyzed previously. Because of the rules of 2D-Nim, it should be clear that the two boards above are essentially equivalent. That is, if there is a winning strategy for the left board, the same one must apply to the right board. The fact that the contiguous groups of pieces appear in different places and orientations is clearly irrelevant. All that matters is that the same clusters of pieces (a cluster being a set of contiguous pieces that can be reached from each other by a sequence of one-square vertical or horizontal moves) appear in each. For example, the cluster of pieces (A, B, C, F, G) appears on both boards, but it has been reflected (swapping left and right), rotated, and moved. Your task is to determine whether two given board states are equivalent in this sense or not.
Input
Output
Sample Input
2
8 5 11
0 0 1 0 2 0 5 0 7 0 1 1 2 1 5 1 3 3 5 2 4 4
0 4 0 3 0 2 1 1 1 4 1 3 3 3 5 2 6 2 7 2 7 4
8 5 11
0 0 1 0 2 0 5 0 7 0 1 1 2 1 5 1 3 3 6 1 4 4
0 4 0 3 0 2 1 1 1 4 1 3 3 3 5 2 6 2 7 2 7 4
Sample Output
YES
NO
Source
#include <iostream> using namespace std; bool map[][];
int W, H, n; struct dot
{
int x, y;
}dots[]; int dot1[], dot2[]; void quicksort(int left, int right, int *dotx)
{
int i, j, temp;
if (left < right)
{
i = left, j = right, temp = dotx[left];
while (i < j)
{
while (i < j&&dotx[j] >= temp) j--;
dotx[i] = dotx[j];
while (i < j&&dotx[i] <= temp) i++;
dotx[j] = dotx[i];
}
dotx[i] = temp;
quicksort(left, j - , dotx);
quicksort(j + , right, dotx);
}
} void Count(int *dot, int i)
{
int x, y, sum;
sum = ;
x = dots[i].x;
y = dots[i].y;
y--;
while (map[x][y] && y >= ) //统计左边点的个数
{
sum++;
y--;
}
y = dots[i].y;
y++;
while (map[x][y] && y < H) //统计右边点的个数
{
sum++;
y++;
}
y = dots[i].y;
x--;
while (map[x][y] && x >= ) //统计下面点的个数
{
sum++;
x--;
}
x = dots[i].x;
x++;
while (map[x][y] && x < W) //统计上面点的个数
{
sum++;
x++;
}
dot[i] = sum;
} int main()
{
int t;
cin >> t;
int sum1, sum2;
while (t--)
{
sum1 = sum2 = ;
memset(map, false, sizeof(map));
cin >> W >> H >> n;
for (int i = ; i <= n; i++) //输入第一组点
{
cin >> dots[i].x >> dots[i].y;
map[dots[i].x][dots[i].y] = true;
}
for (int i = ; i <= n; i++)
Count(dot1, i), sum1 += dot1[i]; //第一张图的连续点数
memset(map, false, sizeof(map));
for (int i = ; i <= n; i++) //输入第二组点
{
cin >> dots[i].x >> dots[i].y;
map[dots[i].x][dots[i].y] = true;
}
for (int i = ; i <= n; i++)
Count(dot2, i), sum2 += dot2[i]; //第二张图的连续点数
if (sum1 != sum2) cout << "NO" << endl;
else
{
quicksort(, n, dot1);
quicksort(, n, dot2);
int flag = ;
for (int i = ; i <= n; i++)
{
if (dot1[i] != dot2[i])
{
//我之前在这里写了输出用来看数据的
//我提交的时候忘记删了,结果还对了
//不得不说这测试数据是真的水
flag = ;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
}
POJ 1021 2D-Nim的更多相关文章
- Georgia and Bob POJ - 1704 阶梯Nim
$ \color{#0066ff}{ 题目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of g ...
- poj 1021矩阵平移装换后是否为同一个矩阵
2D-Nim Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3081 Accepted: 1398 Descriptio ...
- POJ 1704 Staircase Nim 阶梯博弈
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- POJ 1021 人品题
报告见代码.. #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- 狗狗40题~ (Volume C)
A - Triangles 记忆化搜索呗.搜索以某三角形为顶的最大面积,注意边界情况. #include <stdio.h> #include <cstring> #inclu ...
- 【POJ】【2068】Nim
博弈论/DP 这是Nim?这不是巴什博奕的变形吗…… 我也不会捉啊,不过一看最多只有20个人,每人最多拿16个石子,总共只有8196-1个石子,范围好像挺小的,嗯目测暴力可做. so,记忆化搜索直接水 ...
- 【POJ】【2975】Nim
博弈论 我哭……思路错误WA了6次?(好像还有手抖点错……) 本题是要求Nim游戏的第一步必胜策略有几种. 一开始我想:先全部异或起来得到ans,从每个比ans大的堆里取走ans个即可,答案如此累计… ...
- POJ 1704 Georgia and Bob (Nim游戏变形)
题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...
随机推荐
- python装饰器实现对异常代码出现进行监控
异常,不应该存在,但是我们有时候会遇到这样的情况,比如我们监控服务器的时候,每一秒去采集一次信息,那么有一秒没有采集到我们想要的信息,但是下一秒采集到了, 而后每次的采集都能采集到,就那么一次采集不到 ...
- 玩转 Redis缓存 集群高可用
转自:https://segmentfault.com/a/1190000008432854 Redis作为主流nosql,在高并发使用场景中都会涉及到集群和高可用的问题,有几种持久化?场景下的缓存策 ...
- arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计
2018-01-0915:39:24 视频连接 首先arduino中shiftOUT()函数的定义与说明! shiftOut()描述将一个数据的一个字节一位一位的移出.从最高有效位(最左边)或最低有效 ...
- python 闭包初识
def func_100(val): passline = 60 if val >= passline: print('pass') else: print('failed') def func ...
- 用 chrome 调试 node.js 代码
1.全局安装 node-inspector cnpm install -g node-inspector 2.启动node项目入口文件,如 node --inspect index.js 3.控制台 ...
- 嵌套for in循环组合cat方式文件中包含空格问题
关于循环嵌套使用for循环的空格问题 原创不易,转载请注明 需求: 现有两个功文件,需要将文件拼接 [root@localhost ~]# cat name 111 222 223 333 444 5 ...
- 【转】awk用法介绍
1. 介绍 Awk是由Aho.Weinberger和Kernighan三位科学家开发的,特别擅长文本处理的linux 工具,该工具是 linux 下最常用的工具之一.Awk不是普通的工具,其实,也是一 ...
- JS小练习1
要求: 一.定义"改变颜色"的函数 二.定义"改变宽高"的函数 三.定义"隐藏内容"的函数 四.定义"显示内容"的函数 ...
- Python之Django rest_Framework
Django Rest Framework 一.rest api a.api就是接口 如: - http://www.oldboyedu.com/get_user/ ...
- MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片
MP4大文件虚拟HLS分片技术,避免点播服务器的文件碎片 本文主要介绍了通过虚拟分片技术,把MP4文件,映射为HLS协议中的一个个小的TS分片文件,实现了在不实际切分MP4文件的情况下,通过HLS协议 ...