hdu 4021 24 Puzzle ( 逆序数判断是否可解 )
24 Puzzle
The ‘#’ denotes the positions that the tiles may be placed on. There are 24 possible positions in total, so one of them is not occupied by the tile. We can denote the empty position by zero.
Daniel could move the tiles to the empty position if the tile is on the top, bottom, left or right of the empty position. In this way Daniel can reorder the tiles on the board.
Usually he plays with this game by setting up a target states initially, and then trying to do a series of moves to achieve the target. Soon he finds that not all target states could be achieved.
He asks for your help, to determine whether he has set up an impossible target or not.
For each test case, the first line contains 24 integers denoting the initial states of the game board. The numbers are the describing the tiles from top to bottom, left to right. And the empty position is indicated by zero. You can assume that the number of each tile are different, and there must be exactly one empty position. The second line of test case also contains 24 integers denoting the target states.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
3 1 2 0 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
3 0 2 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
Y
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 30
#define MAXN 20005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 0.000001
typedef long long ll;
using namespace std; int n,m,ans,p1,p2;
int a[maxn],b[maxn];
int mp[maxn]; bool presolve()
{
int i,j;
if(a[0]==0) swap(a[0],a[3]);
if(a[1]==0) swap(a[1],a[6]);
if(a[2]==0) swap(a[2],a[3]);
if(a[7]==0) swap(a[7],a[6]);
if(a[16]==0) swap(a[16],a[17]);
if(a[21]==0) swap(a[21],a[20]);
if(a[22]==0) swap(a[22],a[17]);
if(a[23]==0) swap(a[23],a[20]);
if(b[0]==0) swap(b[0],b[3]);
if(b[1]==0) swap(b[1],b[6]);
if(b[2]==0) swap(b[2],b[3]);
if(b[7]==0) swap(b[7],b[6]);
if(b[16]==0) swap(b[16],b[17]);
if(b[21]==0) swap(b[21],b[20]);
if(b[22]==0) swap(b[22],b[17]);
if(b[23]==0) swap(b[23],b[20]);
for(i=0;i<24;i++)
{
if(a[i]==0) p1=i;
if(b[i]==0) p2=i;
}
if(a[0]!=b[0]||a[1]!=b[1]||a[2]!=b[2]||a[7]!=b[7]||
a[16]!=b[16]||a[21]!=b[21]||a[22]!=b[22]||a[23]!=b[23])
return false ;
return true ;
}
int getstate(int x[])
{
int i,j,t,s,sum=0;
for(i=3;i<24;i++)
{
t=x[i];
if(t==0||i==7||i==16||i==21||i==22||i==23) continue ;
s=0;
for(j=i+1;j<24;j++)
{
if(x[j]==0||j==7||j==16||j==21||j==22||j==23) continue ;
if(x[j]<t) s++;
}
sum+=s;
}
return sum;
}
int main()
{
int i,j,t,s1,s2;
mp[3]=mp[4]=mp[5]=mp[6]=1;
mp[8]=mp[9]=mp[10]=mp[11]=2;
mp[12]=mp[13]=mp[14]=mp[15]=3;
mp[17]=mp[18]=mp[19]=mp[20]=4;
scanf("%d",&t);
while(t--)
{
for(i=0;i<24;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<24;i++)
{
scanf("%d",&b[i]);
}
if(presolve())
{
s1=getstate(a);
s2=getstate(b);
if((s1+s2)&1)
{
if(abs(mp[p1]-mp[p2])&1) printf("N\n");
else printf("Y\n");
}
else
{
if(!(abs(mp[p1]-mp[p2])&1)) printf("N\n");
else printf("Y\n");
}
}
else printf("Y\n");
}
return 0;
}
hdu 4021 24 Puzzle ( 逆序数判断是否可解 )的更多相关文章
- HDU 4911 Inversion (逆序数 归并排序)
Inversion 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/A Description bobo has a sequen ...
- hdu 6048 Puzzle 拼图 逆序数
关于拼图和逆序数的关系可以看看这个 http://www.guokr.com/question/579400/ 然后求逆序数在判断就行了 按题意生成原始排列,观察发现,每一轮数后方比该数小的数的数量( ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- HDU 4911 (树状数组+逆序数)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- [HDU POJ] 逆序数
HDU 1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- 【归并排序】【逆序数】HDU 5775 Bubble Sort
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...
- HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个n个数的序列,当中组成的数仅仅有0-n,我们能够进行这么一种操作:把第一个数移到最 ...
- hdu 1394(线段树) 最小逆序数
http://acm.hdu.edu.cn/showproblem.php?pid=1394 给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数 线段树的应 ...
随机推荐
- PAT L3-011. 直捣黄龙
最短路. 先求出一个只包含最短路的$DAG$,然后在$DAG$上$dp$一下就可以了.英文变数字还有$map$转一下. #include<map> #include<set> ...
- js中复制方法总结
js中有深拷贝和浅拷贝两种复制形式,下面总结一下常用方法,方便平时工作复习使用 一.浅拷贝 1.json对象浅拷贝 var newObj = JSON.parse(JSON.stringify( so ...
- python 字符串,数学之间的不可描述的关系
首先说一下输入: >>> a=raw_input(" ") 1.234 >>> a '1.234' >>> 可以看到使用raw ...
- [BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)
发现最多有8个限制位置,可以以此为基础DP和容斥. $f_{i,j}=f_{i-1,j}\times (cnt_j-i+1)+\sum_{k\subset j} f_{i-1,k}$ $cnt_j$表 ...
- hdu 1864 最大报销额(背包)
最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 【序列莫队+树状数组】BZOJ3289-Mato的文件管理
[题目大意] 一共有n份,每份有一个大小和一个编号.Mato每天随机选一个区间[l,r],拷贝出来(即对原序列不影响),给它们排序,并且每次只能交换相邻两份文件.问每天最少交换几次? [思路] 显然, ...
- hibernate双向ManyToMany映射
工作需要一个双向多对多映射,照着李刚的书做了映射,碰到了一些问题,现就问题及解决方案进行总结归纳. 1.首先奉上最初代码 Person5.java @Entity @Table(name = &quo ...
- (转)Hadoop系列-IPC模型
学习笔记Mark IPC 实现RPC的一种方法,具有快速.简单的特点. 它不像Sun公司提供的标准RPC包,基于Java序列化. IPC无需创建网络stubs和skeletons. IPC中的方法调用 ...
- MYSQL复习笔记10-连接
Date: 20140219Auth: Jin 一.介绍连接是二元运算,可以对两个表或多个表进行查询.T-SQL中分两大类,一是符合SQL标准的连接谓词表示形式,二是T-SQL扩展的使用关键字JOIN ...
- 解决URL中包含“%2F”导致Apache地址重写mod_rewrite失效的问题
在使用Apache地址重写mod_rewrite期间,发现,当URL和PATH_INFO中出现%2f(/)或者%5c(\), 会被认为这是个不合法的请求, Apache将会直接返回"404 ...