24 Puzzle

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 1306    Accepted Submission(s): 381
Problem Description
Daniel likes to play a special board game, called 24 puzzle. 24 puzzle is such a game that there are tiles with the number 1 to 23 in a play board like the follow picture:

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.

 
Input
The first line of input contains an integer denoting the number of test cases.

  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.

 
Output
For each test case, if the target is impossible to achieve, output ‘Y’ in a single line, otherwise, output ‘N’.

 
Sample Input
2
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
 
Sample Output
N
Y
 
Source


思路:
认真分析只有中间4*4的方格是有效的,其他8个方格可以去掉,因为只有0在旁边才可以移动,所以只需要将0移进4*4方格,判断里面的数是否相等不等肯定不行,然后就是逆序数问题了,上下交换逆序数改变,左右交换逆序数不变,两个状态的奇偶要与0所在的行的差的奇偶相同。

感想:
比赛时非常肯定这是逆序数问题,一直在纠结那多的八个方格,汗,连8个方格可以去掉都没分析出来,好菜呀!

代码:
#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 ( 逆序数判断是否可解 )的更多相关文章

  1. HDU 4911 Inversion (逆序数 归并排序)

    Inversion 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/A Description bobo has a sequen ...

  2. hdu 6048 Puzzle 拼图 逆序数

    关于拼图和逆序数的关系可以看看这个 http://www.guokr.com/question/579400/ 然后求逆序数在判断就行了 按题意生成原始排列,观察发现,每一轮数后方比该数小的数的数量( ...

  3. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  4. HDU 4911 (树状数组+逆序数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4911 题目大意:最多可以交换K次,就最小逆序对数 解题思路: 逆序数定理,当逆序对数大于0时,若ak ...

  5. HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. [HDU POJ] 逆序数

    HDU 1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...

  7. 【归并排序】【逆序数】HDU 5775 Bubble Sort

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 题目大意: 冒泡排序的规则如下,一开始给定1~n的一个排列,求每个数字在排序过程中出现的最远端 ...

  8. HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个n个数的序列,当中组成的数仅仅有0-n,我们能够进行这么一种操作:把第一个数移到最 ...

  9. hdu 1394(线段树) 最小逆序数

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 给出一列数组,数组里的数都是从0到n-1的,在依次把第一个数放到最后一位的过程中求最小的逆序数 线段树的应 ...

随机推荐

  1. OOX之间的关系

    OOA,OOD,OOP三者关系OOA的分析结果可以作为OOD的需求模型OOD的设计结果作为OOP的指导蓝图OOP负责最终实现目标系统

  2. 洛谷P2278 [HNOI2003] 操作系统

    题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ...

  3. Bzoj3942 Censoring(KMP)

    \(KMP\)问题的核心在于数组\(next\)(或者\(pre\)/\(fail\),各种叫法),几乎所有的此类型题都是需要计算\(next\)的. 这里解释一波\(next\):即满足字符子串\( ...

  4. 自定义word快捷键,设置插入图片快捷键

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 自定义word快捷键,设置插入图片快捷键 文件→选项→自定义功能区 选择键盘快捷方式 自 ...

  5. request (请求对象)

    一.学习请求 学习如何获取请求行, 请求头,请求体. 1. 获取请求行 获取请求方法 String method = request.getMethod(); System.out.println(m ...

  6. 5分钟上手TypeScript

    安装TypeScript 安装这个工具有两种方式: 用npm安装npm install -g typescript 安装visual studio的TypeScript插件 编译TypeScript ...

  7. ApplicationDelegate里的方法

    // 程序第一次加载完毕 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictio ...

  8. 安装配置convirture

    Author: Jin Date: 20130627 Title: 安装配置convirture 参考: http://www.convirture.com/wiki/index.php?title= ...

  9. 通过dbf文件恢复oracle

    可能有些人会由于各种原因经常重装系统,但是系统里面总是有一些比较重要的软件在重装后就不能用了.比如oracle数据库,众所周知数据库如果通过dmp导入导出麻烦不说,还很耗时,特别是像笔者一个数据库就有 ...

  10. mysql的存储目录

    1.MySQL的数据存储目录为data,data目录通常在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server ...