Eight hdu 1043 poj 1077
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
Sample Input
#include <iostream>
#include <cstring> using namespace std; const int maxn = ;
typedef int State[];
State st[maxn];
int goal[] = {, , , , , , , , };
int dx[] = {-, , , };
int dy[] = { , , -, };
int head[maxn], nxt[maxn], fa[maxn];
char dir[maxn]; int Hash(State s) //哈希函数
{
int ret = , i;
for(i = ; i < ; i++) ret = ret * + s[i];
return ret % maxn;
} bool try_to_insert(int rear) //插入哈希表
{
int h = Hash(st[rear]);
for(int e = head[h]; e != -; e = nxt[e])
{
if(memcmp(st[e], st[rear], sizeof(st[e])) == ) return ;
}
nxt[rear] = head[h];
head[h] = rear;
return ;
} int bfs() //遍历
{
int frt = , rear = , i, z;
while(frt < rear)
{
State& s = st[frt];
if(memcmp(s, goal, sizeof(s)) == ) return frt;
for(z = ; s[z] != ; z++);
int x = z / ;
int y = z % ;
for(i = ; i < ; i++)
{
int newx = x + dx[i];
int newy = y + dy[i];
int newz = * newx + newy;
if(newx >= && newx < && newy >= && newy < )
{
State& news = st[rear];
memcpy(news, s, sizeof(s));
news[z] = s[newz];
news[newz] = ;
if(try_to_insert(rear)) //注意这里的路径输出的方式
{
fa[rear] = frt;
switch(i)
{
case : dir[rear] = 'u'; break;
case : dir[rear] = 'd'; break;
case : dir[rear] = 'l'; break;
case : dir[rear] = 'r'; break;
default: break;
}
rear++;
}
}
}
frt++;
}
return ;
} void print(int i) //输出
{
if(fa[i] == -) return;
print(fa[i]);
cout<<dir[i];
} int main()
{
char c[];
int i, ret;
while(cin>>c[]>>c[]>>c[]>>c[]>>c[]>>c[]>>c[]>>c[]>>c[])
{
for(i = ; i < ; i++) st[][i] = c[i] == 'x' ? : (int)(c[i]-'');
memset(head, -, sizeof(head));
fa[] = -;
ret = bfs();
if(ret)
{
print(ret);
}
else cout<<"unsolvable";
cout<<endl;
}
return ;
}
HDU : 这道题时多组输入,所以不能向上面一样在线写,而是要从最终状态开始倒着把所有状态搜索一遍,之后只需要输入初始状态打表判断输出路径即可;
学习到的知识有两个:bfs()路径查找类 + 康拓展开,路径的输出:
/*************************************************************************
> File Name: search.cpp
> Author : PrayG
> Mail: 996930051@qq,com
> Created Time: 2016年07月20日 星期三 10时56分09秒
************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<set>
#include<cmath>
using namespace std;
const int maxn = ;
int fac[] = {,,,,,,,,,};
int dx[] = {,,-,},dy[] = {,,,-};//drul
char ind[] = "uldr";//与上面相反
string path[maxn];//记录路径
bool vis[maxn];
int aim = ;//123456780 的康拓展开 struct node
{
int s[]; //记录状态
int sit0; //0 的位置
int val; //康拓展开的值
string path; // 路径
}; int cant(int s[]) //康拓展开
{
int code = ;
for(int i = ; i < ; i++)
{
int cnt = ;
for(int j= i+ ; j < ; j++)
{
if(s[i] > s[j])
{
cnt++;
}
}
code += fac[-i] * cnt;
}
return code;
} void bfs()
{
memset(vis,false,sizeof(vis));
queue<node> que;
node cnt1,cnt2;
for(int i = ; i < ;i++)
cnt1.s[i] = i+;
cnt1.s[] = ;
cnt1.sit0 = ;
//printf("aim = %d\n",aim);
cnt1.val = aim;
cnt1.path = "";
path[aim] = "";
que.push(cnt1);
while(!que.empty())
{
cnt1 = que.front();
que.pop();
int x = cnt1.sit0 / ;
int y = cnt1.sit0 % ;
for(int i = ; i < ; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
int nz = nx * + ny;
if(nx < || nx > || ny < || ny >)
continue;
cnt2 = cnt1;
cnt2.s[cnt1.sit0] = cnt2.s[nz];
cnt2.s[nz] = ;
cnt2.sit0 = nz;
cnt2.val = cant(cnt2.s);
if(!vis[cnt2.val])
{
vis[cnt2.val] = true;
cnt2.path = ind[i] + cnt1.path;
que.push(cnt2);
path[cnt2.val] = cnt2.path;
}
} }
} int main()
{
bfs();
char t;
while(cin >> t)
{
node st;
if(t == 'x'){
st.s[] = ;
st.sit0 = ;
}
else
st.s[] = t - '';
for(int i = ; i< ; i++)
{
cin >> t;
if(t == 'x')
{
st.s[i] = ;
st.sit0 = i;
}
else
st.s[i] = t -'';
}
st.val = cant(st.s);
if(vis[st.val])
{
cout << path[st.val] << endl;
}
else
cout << "unsolvable" << endl;
}
return ;
}
Eight hdu 1043 poj 1077的更多相关文章
- HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30176 Accepted: 13119 Special ...
- HDU 1043 & POJ 1077 Eight(康托展开+BFS | IDA*)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30176 Accepted: 13119 Special ...
- Eight (HDU - 1043|POJ - 1077)(A* | 双向bfs+康拓展开)
The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...
- Eight POJ - 1077 HDU - 1043 八数码
Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...
- HDU - 1043 - Eight / POJ - 1077 - Eight
先上题目: Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 1403 Eight&POJ 1077(康拖,A* ,BFS,双广)
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- HDU 1043 八数码(八境界)
看了这篇博客的讲解,挺不错的.http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html 判断无解的情况(写完七种境界才发现有直接判 ...
随机推荐
- vue中使用viewerjs
项目创建 插件Viewer.js vue init webpack mytest001 安装viewerjs npm install viewerjs 删掉生成的项目里面的helloWord.vue ...
- Visual Studio 2013 无法创建MVC项目,系统找不到指定的文件.(Exception from HRESULT:08x0070002)
在Visual Studio 2013中创建新MVC项目,(PS:现在创建个MVC项目,差点都找不到在哪,汗!-) 确定后提示,系统找不到指定的文件.(Exception from HRESULT:0 ...
- Axure7.0在OS X Yosemite(10.10)中不能用的问题
电脑升级到了10.10后发现axure7.0不能使用.解决办法也非常easy,就是又一次下载一个新的axure版本号,下载地址:http://www.axure.com/release-candida ...
- Python Tkinter 基础控件学习
# -*- coding: utf-8 -*- from Tkinter import * def btn_click(): b2['text'] = 'clicked' evalue = e.get ...
- angularjs 缓存 $q
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求
摘自:http://kczxsp.hnu.edu.cn/upload/20150504165623705.pdf 里面对于木马的实验过程写得非常清楚,值得一看. 木马是隐藏在正常程序中的具有特殊功 ...
- Numpy科学计算工具
Numpy初探 Numpy基础数据结构 Numpy数组是一个多维数组,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的原数据 导入该库: import numpy as np 多维数组 ...
- Automation testing tool comparison - UFT & CodedUITest
Ease of Use - Recording and Playback Functionality UFT provides 4 models to record a new test. Norma ...
- SSRS 报表 递归列表
SSRS 报表 递归列表 .需要数据集合中两个必备字段 ID PID 1.添加数据集合,在图上标记的地方点击右键添加数据集合,根据需求自己编写 2.点击插入选项卡 中的 矩阵 有两种方式 一种是 矩 ...
- UWP开发小结
做了两天的UWP开发,上手还是挺快的,不过比较郁闷的是总会被一些很简单的细节卡住很久. 首先当然是用C#修改xaml界面这个难点了,Bing搜了好久都没找到相关信息,最后还是老司机伟神指点的我.对于g ...