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是奇数,则将 ...
随机推荐
- asp.net -mvc框架复习(8)-实现用户登录模型部分的编写
1.配置文件添加数据库连接字符串(web.config) 2.编写通用数据库访问类 (1)引入命名空间 using System.Configuration; (2) 定义连接字符串 (3)编写完成 ...
- relative 和 absolute 定位关系
问题: relative 和 absolute 之间的关系是什么?有什么区别? 那,答案呢? relative 相对定位, 以自己没有设置relative 属性之前的位置来定位,占用没有设置rela ...
- CentOS7 配置花生壳开机启动
在家安装服务器,外地可以随时登陆,感觉花生壳特别方便,具体路由器配置请参考http://service.oray.com/question/2486.html. 我使用的操作系统是 [root@loc ...
- CentOS如何把deb转为rpm
说明:可以转换,但不一定可用,可以根据报错提示,安装需要的依赖. 1 安装alien工具,下载地址http://ftp.de.debian.org/debian/pool/main/a/alien/ ...
- RChain节点通信机制(上)
在介绍RChain的通信机制之前,先简单介绍一些以太坊的通信机制,它包括以下几个方面,如下详细了解以太坊的通信机制,可以查看https://github.com/ethereum/devp2p/blo ...
- Struts2是什么?
Struts2是什么: Struts2是整合了struts1和webwork的技术优点的使用广泛的MVC框架: Struts2的特点: 1.基于MVC框架,结构清晰,便于开发人员掌控开发流程: 2.使 ...
- GitHub For Beginners: Don’t Get Scared, Get Started
It's 2013, and there's no way around it: you need to learn how to use GitHub.2 Why? Because it's a s ...
- python监控微信报警
微信接口调用代码: #coding=utf8 import itchat from flask import Flask, request itchat.auto_login(enableCmdQR= ...
- 32位系统装4G以上的内存
1.操作系统在32位平台上最大寻址空间是4GB,如果要使用4GB以上的内存,就必须使用intel的PAE(物理地址扩展)模式,在windows NT平台实现PAE只需对boot.ini加上/pae即可 ...
- SQL explain详细结果
explain 的结果 id select_type 查询的序列号 select_type simple (不含子查询) primary (含子查询.或者派生查询) subquery (非from子查 ...