Eight

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10778    Accepted Submission(s):
2873
Special Judge

Problem Description
The 15-puzzle has been around for over 100 years; even
if you don't know it by that name, you've seen it. It is constructed with 15
sliding tiles, each with a number from 1 to 15 on it, and all packed into a 4 by
4 frame with one tile missing. Let's call the missing tile 'x'; the object of
the puzzle is to arrange the tiles so that they are ordered as:

 1  2  3  4
5 6 7 8
9 10 11 12
13 14 15 x

where
the only legal operation is to exchange 'x' with one of the tiles with which it
shares an edge. As an example, the following sequence of moves solves a slightly
scrambled puzzle:

 1  2  3  4     1  2  3  4     1  2  3  4     1  2  3  4
5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8
9 x 10 12 9 10 x 12 9 10 11 12 9 10 11 12
13 14 11 15 13 14 11 15 13 14 x 15 13 14 15 x
r-> d-> r->

The
letters in the previous row indicate which neighbor of the 'x' tile is swapped
with the 'x' tile at each step; legal values are 'r','l','u' and 'd', for right,
left, up, and down, respectively.

Not all puzzles can be solved; in
1870, a man named Sam Loyd was famous for distributing an unsolvable version of
the puzzle, and
frustrating many people. In fact, all you have to do to make
a regular puzzle into an unsolvable one is to swap two tiles (not counting the
missing 'x' tile, of course).

In this problem, you will write a program
for solving the less well-known 8-puzzle, composed of tiles on a three by three

arrangement.

 
Input
You will receive, several descriptions of configuration
of the 8 puzzle. One description is just a list of the tiles in their initial
positions, with the rows listed from top to bottom, and the tiles listed from
left to right within a row, where the tiles are represented by numbers 1 to 8,
plus 'x'. For example, this puzzle

1 2 3
x 4 6
7 5 8

is
described by this list:

1 2 3 x 4 6 7 5 8

 
Output
You will print to standard output either the word
``unsolvable'', if the puzzle has no solution, or a string consisting entirely
of the letters 'r', 'l', 'u' and 'd' that describes a series of moves that
produce a solution. The string should include no spaces and start at the
beginning of the line. Do not print a blank line between cases.
 
Sample Input
2 3 4 1 5 x 7 6 8
 
Sample Output
ullddrurdllurdruldr
 
Source
 
Recommend
JGShining   |   We have carefully selected several
similar problems for you:  1044 1401 1104 1254 1732
 
 康托展开优化,代码自己写的过了,做EIGHTII的时候,发现别人bfs()很简单,而且map[4][2]写的看不懂。
 
 #include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<string>
#include<queue>
using namespace std; struct node
{
bool flag;
char str;
int father;
}hash[];
struct st
{
char t[];
};
queue<st>Q;
int ans[]={}; int ktzk(char *c)
{
int i,j,k,sum=;
for(i=;i<=;i++)
{
k=;
for(j=i+;j<=;j++)
if(c[i]>c[j])
k++;
sum=sum+k*ans[-i];
}
return sum;
}
void bfs()
{
int i,k,num,val;
struct st cur,t;
k=ktzk("");
hash[k].flag=true;
hash[k].str='\0';
hash[k].father=k; strcpy(t.t,"");
Q.push(t); while(!Q.empty())
{
cur=Q.front();
Q.pop();
val=ktzk(cur.t);
for(i=;i<=;i++)
{
if(cur.t[i]=='')
{
k=i;
break;
}
}
if(k!= && k!= && k!=)//rigth
{
t=cur;
swap(t.t[k],t.t[k+]);
num=ktzk(t.t);
if(hash[num].flag==false)
{
hash[num].flag=true;
hash[num].str='r';
hash[num].father=val;
Q.push(t);
}
}
if(k!= && k!= && k!=)//left
{
t=cur;
swap(t.t[k],t.t[k-]);
num=ktzk(t.t);
if(hash[num].flag==false)
{
hash[num].flag=true;
hash[num].str='l';
hash[num].father=val;
Q.push(t);
}
}
if(k>=)//u
{
t=cur;
swap(t.t[k],t.t[k-]);
num=ktzk(t.t);
if(hash[num].flag==false)
{
hash[num].flag=true;
hash[num].str='u';
hash[num].father=val;
Q.push(t);
}
}
if(k<=)//D
{
t=cur;
swap(t.t[k],t.t[k+]);
num=ktzk(t.t);
if(hash[num].flag==false)
{
hash[num].flag=true;
hash[num].str='d';
hash[num].father=val;
Q.push(t);
}
}
}
}
void prepare()
{
int i;
for(i=;i<=;i++)
{
hash[i].flag=false;
}
for(i=;i<=;i++) ans[i]=ans[i-]*i;
bfs();
}
int main()
{
prepare();
char a[],b[],c[];
bool tom[];
int i,j,k,cur;
while(gets(a))
{
k=strlen(a);
b[]='\0';
for(i=,j=;i<k;i++)
{
if(a[i]=='x' || (a[i]>=''&&a[i]<=''))
{
if(a[i]=='x')
b[j]='';
else b[j]=a[i];
j++;
}
}
memset(tom,false,sizeof(tom));
for(i=;i<=;i++)
{
tom[b[i]-'']=true;
}
for(i=;i<=;i++)
{
if(tom[i]==false)
break;
}
if(i<=){printf("unsolvable\n");continue;}
cur=ktzk(b);
if(hash[cur].flag==false)
{
printf("unsolvable\n");
continue;
}
k=;
while(hash[cur].father!=cur)
{
c[k]=hash[cur].str;
k++;
cur=hash[cur].father;
}
for(i=;i<=k-;i++)
{
if(c[i]=='u')printf("d");
if(c[i]=='d')printf("u");
if(c[i]=='l')printf("r");
if(c[i]=='r')printf("l");
}
printf("\n");
}
return ;
}

hdu 1043 八数码问题的更多相关文章

  1. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  2. HDU 1043 八数码(A*搜索)

    在学习八数码A*搜索问题的时候须要知道下面几个点: Hash:利用康托展开进行hash 康托展开主要就是依据一个序列求这个序列是第几大的序列. A*搜索:这里的启示函数就用两点之间的曼哈顿距离进行计算 ...

  3. HDU 1043 八数码(八境界)

    看了这篇博客的讲解,挺不错的.http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 判断无解的情况(写完七种境界才发现有直接判 ...

  4. HDU 1043 八数码问题的多种解法

    一.思路很简单,搜索.对于每一种状态,利用康托展开编码成一个整数.于是,状态就可以记忆了. 二.在搜索之前,可以先做个优化,对于逆序数为奇数的序列,一定无解. 三.搜索方法有很多. 1.最普通的:深搜 ...

  5. HDU 1043 八数码 Eight A*算法

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  6. Eight hdu 1043 八数码问题 双搜

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

  8. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

  9. Hdu 1043 Eight (八数码问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目描述: 3*3的格子,填有1到8,8个数字,还有一个x,x可以上下左右移动,问最终能否移动 ...

随机推荐

  1. 基于Zookeeper实现的分布式互斥锁 - InterProcessMutex

    Curator是ZooKeeper的一个客户端框架,其中封装了分布式互斥锁的实现,最为常用的是InterProcessMutex,本文将对其进行代码剖析 简介 InterProcessMutex基于Z ...

  2. Java并发工具类之CountDownLatch

    CountDownLatch允许一个或则多个线程等待其他线程完成操作. 假如我们有这样的需求:我们需要解析一个excel文件中的多个sheet,我们可以考虑使用多线程,每一个线程解析excel中的一个 ...

  3. Flask从入门到精通之链接的使用

    在Web开发中,任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条. 在模板中直接编写简单路由的URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL 就很困难.而且,直 ...

  4. 转的很好的前端html 内容

    HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...

  5. css 题目笔记(本文收集了一些个人觉得比较有意思的css题目,欢迎大家给出自己的解答)

    1.本文收集了一些个人觉得比较有意思的css题目,欢迎大家给出自己的解答 P标签的最大宽度不可以大于H2标签文字宽度的10% 这里应该是P标签的最大宽度由前面的匿名内联元素宽度(就是大字号文字宽度)决 ...

  6. Ubuntu软件更新时出错问题解决

    apt-get instal update 提示:错误,无法解析域名等等之类的 网上解决办法一大堆,先别急着用网上的方法,来检查检查系统是否有网络连接 网络图标显示网络连接,等等,别被表面迷惑了,命令 ...

  7. 【NOIP2017】列队 splay

    当年太菜了啊,连$60$分的暴力都没拿满,只打了一个$30$分的. 考虑到这题最多只会询问到$30W$个点,且整个矩阵会去到$30W\times 30W$,显然不能将所有的点存下来. 对于每一行(除最 ...

  8. POJ 1089

    #include <iostream> #include <algorithm> #define MAXN 50005 using namespace std; struct ...

  9. Linux实用指令

    Linux实用指令 Rpm&Yum ​ 一种用于互联网下载包的打包和安装工具,它包含某些Linux分发版中,它生产具有 .rpm 扩展名的文件.RPM 是 RedHat Package Man ...

  10. (转)IBM AIX系统为rootvg实现镜像

    IBM AIX系统为rootvg实现镜像 AIX系统安装的时候,没有选择安装镜像,因此在系统安装完成后,出于安全方面的考虑,决定为rootvg创建镜像. 工具/原料 AIX rootvg lspv c ...