hdu 4021 n数码
好题,6666
转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2652410.html
题意:给出一个board,上面有24个位置,其中23个位置上放置了标有数字1~23的方块,一个为空位(用数字0表示),现在可以把空位与它旁边的方块交换,给出board的起始状态,问是否可以达到指定的状态。

思路:看起来很像著名的“八数码”问题,首先,针对八个特殊位置(死角),如果这里有空位就把它和相邻的位置交换,这样之后如果两个状态的对应死角上的数字不同,那么显然是不能达到指定状态的,因为无法把死角处的数字换出去。
搞定了死角后就只剩下4×4的board了,这就变成了八数码问题的拓展——15数码。首先想想八数码是如何判断有解的:首先把所有数字(不包括空
位的0)写成一行,就得到了一个1~8的排列,考虑空位的交换情况:1.左右交换,2.上下交换。对于左右交换而言,是不会改变写出的排列的逆序数的;而
对上下交换,相当于在排列中向前或向后跳了两个位置,那么要么两个数都比它大或小,这样逆序数加2或减2,要么两个数一个比它大一个比它小,这样逆序数不
变,综上,对于八数码问题,操作不会改变逆序数的奇偶性,所以只有初始状态和指定状态的逆序数奇偶性相同就有解。
弄清楚了八数码,扩展起来就容易了,现在我们将其扩展到N维(即N*N的board,N*N-1数码问题)。
首先无论N的奇偶,左右交换不改变逆序数,N为奇数时:上下交换逆序数增加N-1或减少N-1或不变,因为N为奇数,所以逆序数奇偶性不变;而N为偶数时:上下交换一次奇偶性改变一次。
结论:N为奇数时,初始状态与指定状态逆序数奇偶性相同即有解;N为偶数时,先计算出从初始状态到指定状态,空位要移动的行数m,如果初始状态的逆序数加上m与指定状态的逆序数奇偶性相同,则有解。
好了,现在这道题就简单了,计算逆序数和空格要移动的行数即可。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[];
int b[];
int c[];
int d[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=;i<;i++)
scanf("%d",&a[i]);
for(int i=;i<;i++)
scanf("%d",&b[i]);
//将八个死角的空转过来
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]);
if(a[]==)swap(a[],a[]); if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
if(b[]==)swap(b[],b[]);
bool flag=true;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(a[]!=b[])flag=false;
if(flag==false)
{
printf("Y\n");
continue;
}
//转化为n数码问题
for(int i=;i<;i++)
{
c[i]=a[i+];
d[i]=b[i+];
}
for(int i=;i<;i++)
{
c[i]=a[i+];
d[i]=b[i+];
}
for(int i=;i<;i++)
{
c[i]=a[i+];
d[i]=b[i+];
}
//求逆序数
int cnt1=;
int cnt2=;
int m1=,m2=;
for(int i=;i<;i++)
{
if(c[i]==)
{
m1=i;
continue;
}
for(int j=;j<i;j++)
{
if(c[i]<c[j])cnt1++;
}
}
for(int i=;i<;i++)
{
if(d[i]==)
{
m2=i;
continue;
}
for(int j=;j<i;j++)
{
if(d[i]<d[j])cnt2++;
}
}
m1/=;//行数
m2/=;//行数
int m=abs(m1-m2); if(((cnt1+m)%)!=(cnt2%))flag=false;
if(flag)printf("N\n");
else printf("Y\n");
}
return ;
}
hdu 4021 n数码的更多相关文章
- Eight POJ - 1077 HDU - 1043 八数码
Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...
- HDU 1043 八数码(八境界)
看了这篇博客的讲解,挺不错的.http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 判断无解的情况(写完七种境界才发现有直接判 ...
- HDU 1043 八数码问题的多种解法
一.思路很简单,搜索.对于每一种状态,利用康托展开编码成一个整数.于是,状态就可以记忆了. 二.在搜索之前,可以先做个优化,对于逆序数为奇数的序列,一定无解. 三.搜索方法有很多. 1.最普通的:深搜 ...
- HDU 1043 八数码(A*搜索)
在学习八数码A*搜索问题的时候须要知道下面几个点: Hash:利用康托展开进行hash 康托展开主要就是依据一个序列求这个序列是第几大的序列. A*搜索:这里的启示函数就用两点之间的曼哈顿距离进行计算 ...
- HDU 1043 八数码 Eight A*算法
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Eight hdu 1043 八数码问题 双搜
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1043 八数码问题
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 4021 24 Puzzle ( 逆序数判断是否可解 )
24 Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total ...
- 逆向bfs搜索打表+康拓判重
HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...
随机推荐
- JS自动格式化输入的数字/千位分隔符VIEW:858
<script> function cc(s){ if(/[^0-9\.]/.test(s)) return "invalid value"; ss=s.replace ...
- spring mvc静态资源文件的引用
在页面的<title>下 <link rel="stylesheet" href="<%=request.getContextPath()%> ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- ThinkPHP 分页实现
TP3.2框架手册,有一个数据分页,不过每次都要写太多的代码,还有中文设置等有些麻烦,做为程序开发者,有必要整理下: O.先看效果图 一.分页方法 /** * TODO 基础分页的相同代码封装,使前台 ...
- CSS3实现二十多种基本图形
CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...
- 开机提示grub可咋办啊
导读 GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数. 1 ...
- ssh和mvc理论基础
ssh中mvc到底指的什么 mvcsshhibernatespringstrutsioc在SSH整合的架构中,Spring充当了一个容器的作用,Spring使用IOC和AOP技术接管了Hibernat ...
- index and polymorphic
http://guides.rubyonrails.org/association_basics.html#polymorphic-associations class CreateStars < ...
- 在pc游览器端模拟移动端幻灯片
用简单的思路写了下pc端模拟web端的图片滑动效果... 效果卡,bug多,完毕,继续学习c3方法写这个,iscroll就是可以模拟这种效果,还在学习中,难点<触点判断> 代码一份 < ...
- poj1328贪心 雷达,陆地,岛屿问题
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60381 Accepted: 13 ...