Eight Puzzle

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/contest/show/61

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. To simplify this problem, you should print the minimum steps only.

Input

There are multiple test cases.

For each test case, you will receive a description of a configuration of the 8 puzzle. The 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.Otherwise, output an integer which equals the minimum steps.

Sample Input

1 2 x 4 5 3 7 8 6

Sample Output

2

HINT

Any violent algorithm may gain TLE. So a smart method is expected.

The data used in this problem is unofficial data prepared by hzhua. So any mistake here does not imply mistake in the offcial judge data.

题意

八数码问题

题解:

爆搜题
八数码:
1.A*搜索,是否AC看脸
2.双向BFS
3.单次BFS预处理之后,O(1)回答

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
int Num;
char CH[];
//const int inf=0x7fffffff; //нчоч╢С
const int inf=0x3f3f3f3f;
/* inline void P(int x)
{
Num=0;if(!x){putchar('0');puts("");return;}
while(x>0)CH[++Num]=x%10,x/=10;
while(Num)putchar(CH[Num--]+48);
puts("");
}
*/
inline ll read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
//************************************************************************************** map<int,int> vis1;
map<int,int> vis2;
char s[];
int dx[]={,-,,};
int dy[]={,,,-};
struct node
{
int m[][];
int x,y;
int ha;
int t;
};
node st;
int check()
{
int a[],t=;
for(int i=;i<;i++)
for(int j=;j<;j++)
a[t++]=st.m[i][j];
t=;
for(int i=;i<;i++)
for(int j=i+;j<;j++)
if(a[i]&&a[j]&&a[i]>a[j])
t++;
return t&;
}
int get_ha(node b)
{
int sum=;
int a[],t=;
for(int i=;i<;i++)
for(int j=;j<;j++)
a[t++]=b.m[i][j]; ll N=;
long long h=;
for(int i=;i<;i++)
h=(h*+(a[i])+N)%N;
return h%N;
}
int main()
{
char ch;
node aimm;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.m[][]=;
aimm.x=;
aimm.y=;
aimm.t=;
int aim=get_ha(aimm);
aimm.ha=aim;
while(cin>>ch)
{
vis1.clear();
vis2.clear();
s[]=ch;
for(int i=;i<;i++)
{
cin>>ch;
s[i]=ch;
}
int m=;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
if(s[m]=='x')st.m[i][j]=,st.x=i,st.y=j;
else st.m[i][j]=s[m]-'';
m++;
}
} if(check())
{
printf("unsolvable\n");
continue;
}
st.t=;
st.ha=get_ha(st);
vis1[st.ha]=;
vis2[aimm.ha]=;
queue<node> q;
queue<node> q2;
q2.push(aimm);
q.push(st);
while(!q.empty()||!q2.size())
{
if(!q.empty())
{
node now=q.front();
/*
cout<<now.t<<" "<<1<<endl;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<now.m[i][j];
}
cout<<endl;
}
cout<<endl;
*/
if(vis2[now.ha])
{
//cout<<now.t<<" "<<"1231231"<<endl;
printf("%d\n",now.t+vis2[now.ha]-);
break;
}
q.pop();
for(int i=;i<;i++)
{
node next=now;
next.t++;
if(next.x+dx[i]<||next.x+dx[i]>=)
continue;
if(next.y+dy[i]<||next.y+dy[i]>=)
continue;
swap(next.m[next.x][next.y],next.m[next.x+dx[i]][next.y+dy[i]]);
next.ha=get_ha(next);
next.x+=dx[i];
next.y+=dy[i];
if(vis1[next.ha]>)
continue;
vis1[next.ha]=next.t;
q.push(next);
}
}
if(!q2.empty())
{
node now=q2.front();
/*
cout<<now.t<<" "<<2<<endl;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<now.m[i][j];
}
cout<<endl;
}
cout<<endl;
*/
if(vis1[now.ha])
{
//cout<<now.t<<" "<<"12312131"<<endl;
printf("%d\n",now.t+vis1[now.ha]-);
break;
}
q2.pop();
for(int i=;i<;i++)
{
node next=now;
next.t++;
if(next.x+dx[i]<||next.x+dx[i]>=)
continue;
if(next.y+dy[i]<||next.y+dy[i]>=)
continue;
swap(next.m[next.x][next.y],next.m[next.x+dx[i]][next.y+dy[i]]);
next.ha=get_ha(next);
next.x+=dx[i];
next.y+=dy[i];
if(vis2[next.ha]>)
continue;
vis2[next.ha]=next.t;
q2.push(next);
}
}
}
}
}

2015 UESTC 搜索专题F题 Eight Puzzle 爆搜的更多相关文章

  1. 2015 UESTC 搜索专题E题 吴队长征婚 爆搜

    吴队长征婚 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Descri ...

  2. 2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS

    基爷与加法等式 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Desc ...

  3. 2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp

    秋实大哥の恋爱物语 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 De ...

  4. 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索

    邱老师降临小行星 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

  5. 2015 UESTC 搜索专题N题 韩爷的梦 hash

    韩爷的梦 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Descrip ...

  6. 2015 UESTC 搜索专题M题 Palindromic String 马拉车算法

    Palindromic String Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/s ...

  7. 2015 UESTC 搜索专题J题 全都是秋实大哥 kmp

    全都是秋实大哥 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Desc ...

  8. 2015 UESTC 搜索专题D题 基爷的中位数 二分

    基爷的中位数 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Descr ...

  9. 2015 UESTC 搜索专题A题 王之迷宫 三维bfs

    A - 王之迷宫 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...

随机推荐

  1. DAY1-GO初识(概述)

    一.概述 1.特征 1.1.语法简单:规则严谨.保留指针.但默认阻止指针运算.将切片和字典作为内置类型.更好的维护性: 1.2.并发模型:运行时用GOroutine,一个关键字.简单而自然:搭配cha ...

  2. lspci 虚拟机网卡对应关系

    我这个办法有点笨: 到 /sys/devices/ 下去搜索网卡 eth*,找到网卡对应的PCI 总线位置,例如:05:00.0. 然后通过 "lspci -s 05:00.0" ...

  3. UVA 1103 How Many O's?

    题目链接:UVA-11038 题意为给定n和m,求n和m之间(包含)的所有数包含的0的个数. 思路是,用cal(x)表示小于等于x的数包含的0的个数.则答案为cal(n)-cal(m-1). 再把求c ...

  4. openjudge-NOI 2.6-2000 最长公共子上升序列

    题目链接:http://noi.openjudge.cn/ch0206/2000/ 题解: 裸题,不解释(题目有毒) #include<cstdio> #include<algori ...

  5. php 高并发解决方案(用于抢购) 转载

    最近在做一个团购项目,遇到个问题,就是在抢购.秒杀.抽奖等活动时,库存数量有限,但是同时下单人数超过了库存数量,就会导致商品超售问题.那么我们怎么来解决这个问题呢,我的思路如下: sql1:查询商品库 ...

  6. linux下C语言编程,include的默认搜索路径

    C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...

  7. Java显式锁学习总结之五:ReentrantReadWriteLock源码分析

    概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和 ...

  8. Visual Studio 中如何同时注释多行和取消注释多行

    注释多行:先按 Ctrl - K 组合键,再按 Ctrl - C 组合键 取消注释多行:先按 Ctrl - K 组合键,再按 Ctrl - U 组合键

  9. 项目里用到的python知识点

    1 ini文件处理创建ini文件config = configparser.ConfigParser()config.read(AUTH_STATUS_FILE)config.add_section( ...

  10. ubuntu怎么连接centos远程桌面

    1.系统软件设置CentOS端:查看是否安装了vnc软件# rpm -q vnc vnc-serverpackage vnc is not installedvnc-server-4.1.2-14.e ...