Description

The 2D-Nim board game is played on a grid, with pieces on the grid points. On each move, a player may remove any positive number of contiguous pieces in any row or column. The player who removes the last piece wins. For example, consider the left grid in the following figure. 
 
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

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by the input data for each test case. The first line of each test case consists of three integers W, H, and n (1 ≤ W, H ≤ 100). W is the width, and H is the height of the grid in terms of the number of grid points. n is the number of pieces on each board. The second line of each test case contains a sequence of n pairs of integers xi , yi, giving the coordinates of the pieces on the first board (0 ≤ xi < W and 0 ≤ yi < H). The third line of the test case describes the coordinates of the pieces on the second board in the same format.

Output

Your program should produce a single line for each test case containing a word YES or NO indicating whether the two boards are equivalent or not.

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

Tehran 2002, First Iran Nationwide Internet Programming Contest
 
    题目大致意思:就是两张图啦,然后有一个相消规则,再给你一个图,问你这两个图等价不?
    分析:
    特别水的题,不仅题目水,测试数据更水,无力吐槽。
    讲一下做的方法:
    1.既然是要等价的话,那么对于某个点,它的操作方法在另一张图上对应的点操作方法和操作方法数肯定是一样的。
    2.而且题目说了,只能消连续相邻的点
    3.既然如此,那么对应的点的连续相邻的点的个数一定要相同,不然要是缺一个或者多一个,那么操作的方法和次数都会不一样
    4.那么这题目就转化成了求连续相邻点的个数的问题了,是不是很水
    5.不过最后的连续相邻点个数的数组要排一次序
 
代码如下:
#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的更多相关文章

  1. Georgia and Bob POJ - 1704 阶梯Nim

    $ \color{#0066ff}{ 题目描述 }$ Georgia and Bob decide to play a self-invented game. They draw a row of g ...

  2. poj 1021矩阵平移装换后是否为同一个矩阵

    2D-Nim Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3081   Accepted: 1398 Descriptio ...

  3. POJ 1704 Staircase Nim 阶梯博弈

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...

  4. POJ 1021 人品题

    报告见代码.. #include <iostream> #include <cstdio> #include <cstring> #include <algo ...

  5. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

  6. 狗狗40题~ (Volume C)

    A - Triangles 记忆化搜索呗.搜索以某三角形为顶的最大面积,注意边界情况. #include <stdio.h> #include <cstring> #inclu ...

  7. 【POJ】【2068】Nim

    博弈论/DP 这是Nim?这不是巴什博奕的变形吗…… 我也不会捉啊,不过一看最多只有20个人,每人最多拿16个石子,总共只有8196-1个石子,范围好像挺小的,嗯目测暴力可做. so,记忆化搜索直接水 ...

  8. 【POJ】【2975】Nim

    博弈论 我哭……思路错误WA了6次?(好像还有手抖点错……) 本题是要求Nim游戏的第一步必胜策略有几种. 一开始我想:先全部异或起来得到ans,从每个比ans大的堆里取走ans个即可,答案如此累计… ...

  9. POJ 1704 Georgia and Bob (Nim游戏变形)

    题目:http://poj.org/problem?id=1704 思路:Nim游戏策略,做如下转换,如果N是偶数,则两两配对,将两个数之间的格子数(距离)看做成这一堆石头的数量. 如果N是奇数,则将 ...

随机推荐

  1. Uva 12171 Sculpture - 离散化 + floodfill

    题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. 在ARC下,assign和weak的区别

    用了很久,却不知道它俩究竟有什么区别,作为一个新手来说,光会用不行,还要懂得原理. 首先说说区别:weak只可以修饰对象                    assign既可以修饰对象也可以修饰基本 ...

  3. J.U.C JMM. pipeline.指令重排序,happen-before(续)

    前面已经介绍硬件平台Cache Coherence问题和解决办法,下面来看看Java虚拟机平台的相关知识.硬件平台处理器,高速缓存,主存之间的交互关系如下: Java内存模型(JMM)         ...

  4. Failed to load the JNI library "E:\JDK6.0\bin\client\jvm.dll"

    在打开Eclipse是错误提示:Failed to load the JNI library "E:\JDK6.0\bin\client\jvm.dll" 如图1所示 图1 遇到这 ...

  5. 已有使用Key登陆机器,创建新账号并使用新Key登陆

    背景信息:CentOS6.9机器,目前是使用Key进行登陆的,现在需要创建一个新账号并使用新生成的Key进行登陆使用 使用连接Linux工具:XShell 1.在当前机器中创建一个新用户: # use ...

  6. 微信屏蔽js分享、复制链接

    页面内引入js(不放在页面内部不起作用) $(function(){ function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu'); ...

  7. linkin大话java

    青春不灭,理想犹存,linkin--勿忘初心! 不知不觉已经和java并肩作战将近了2年,在这2年之中模模糊糊研究了java2ee领域的好多东西,但是都没有做系统的整理.以前写的笔记也是零零散散不成一 ...

  8. 如何修改nexus的端口号

    1. Maven仓库:放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源. 简言之,Maven仓库能帮助 ...

  9. 错误:Invalid action class configuration that references an unknown class named [XXX]的解决

    问题: 用http的方式直接调用类,执行完毕后报错误信息Invalid action class configuration that references an unknown class name ...

  10. ClearCase新增文件

    原文地址:http://blog.csdn.net/ace_fei/article/details/7531376 大家应该都知道在clearcase上新增文件是通过以下过程来生成的: clearto ...