只有9!=362880个状态,用康托展开hash一下直接bfs即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=1000005,fac[]={1,1,2,6,24,120,720,5040,40320,362880},d1[]={4,1,2,7,5,3,8,9,6},d2[]={1,2,3,6,4,5,7,8,9};
int a[15],b[15],v[15],dis[N],la[N],tot;
long long s,t=123456789,ans[N];
int has(long long x)
{
for(int i=9;i>=1;i--)
a[i]=x%10,x/=10;
int r=0;
for(int i=1,sm;i<=9;i++)
{
sm=0;
for(int j=i+1;j<=9;j++)
if(a[j]<a[i])
sm++;
r+=fac[9-i]*sm;
}
return r;
}
long long rel(int x)
{
memset(v,0,sizeof(v));
long long r=0;
for(int i=9;i>=1;i--)
{
int t=x/fac[i-1];
x%=fac[i-1];
for(int j=1,w=0;j<=9;j++)
if(!v[j])
{
w++;
if(w==t+1)
{
r=r*10+j;
v[j]=1;
break;
}
}
}
return r;
}
int main()
{
for(int i=1,x;i<=9;i++)
scanf("%d",&x),s=s*10+x+1;
s=has(s),t=has(t);//cerr<<s<<" "<<t<<" "<<rel(s)<<" "<<rel(t)<<endl;
queue<int>q;
dis[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();//cerr<<u<<endl<<rel(u)<<endl;
q.pop();
if(u==t)
break;
long long x=rel(u),v1=0,v2=0;
for(int i=9;i>=1;i--)
a[i]=x%10,x/=10;
for(int i=0;i<9;i++)
v1=v1*10+a[d1[i]],v2=v2*10+a[d2[i]];//cerr<<v1<<" "<<v2<<endl;
v1=has(v1),v2=has(v2);//cerr<<v1<<" "<<v2<<endl;
if(!dis[v1])
la[v1]=u,dis[v1]=dis[u]+1,q.push(v1);
if(!dis[v2])
la[v2]=u,dis[v2]=dis[u]+1,q.push(v2);
}
if(!dis[t])
{
puts("UNSOLVABLE");
return 0;
}
printf("%d\n",dis[t]-1);
for(int i=t;i!=s;i=la[i])
ans[++tot]=rel(i);
ans[++tot]=rel(s);
for(int i=tot;i>=1;i--)
{
for(int j=1;j<=9;j++)
a[j]=ans[i]%10-1,ans[i]/=10;
printf("%d %d %d\n%d %d %d\n%d %d %d\n\n",a[9],a[8],a[7],a[6],a[5],a[4],a[3],a[2],a[1]);
}
return 0;
}

洛谷 P2578 [ZJOI2005]九数码游戏【bfs+康托展开】的更多相关文章

  1. [ZJOI2005]九数码游戏(BFS+hash)

    Solution 这题的话直接上BFS就可以了,因为要输出方案,所以我们要开一个pre数组记录前驱,最后输出就可以了. 对于状态的记录,一般都用哈希来存,但因为这道题比较特殊,它是一个排列,所以我们可 ...

  2. [ZJOI2005]九数码游戏

    [ZJOI2005]九数码游戏 题目描述 输入输出格式 输入格式: 输入文件中包含三行三列九个数,同行的相邻两数用空格隔开,表示初始状态每个方格上的数字.初始状态不会是目标状态. 输出格式: 如果目标 ...

  3. 洛谷 - P2578 - 九数码游戏 - bfs

    https://www.luogu.org/problemnew/show/P2578 一个挺搞的东西,用康托展开做记忆化搜索可以少一个log的查询. #include <bits/stdc++ ...

  4. [洛谷P3014][USACO11FEB]牛线Cow Line (康托展开)(数论)

    如果在阅读本文之前对于康托展开没有了解的同学请戳一下这里:  简陋的博客    百度百科 题目描述 N(1<=N<=20)头牛,编号为1...N,正在与FJ玩一个疯狂的游戏.奶牛会排成一行 ...

  5. LG2578 「ZJOI2005」九数码游戏 bfs

    问题描述 LG2578 题解 用string+map去重. bfs即可. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace ...

  6. 万圣节后的早晨&&九数码游戏——双向广搜

    https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终 ...

  7. hdu3567 八数码2(康托展开+多次bfs+预处理)

    Eight II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 130000/65536 K (Java/Others)Total S ...

  8. HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】

    一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...

  9. POJ 1077 Eight (BFS+康托展开)详解

    本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...

随机推荐

  1. Android使用procrank和dumpsys meminfo 、top分析内存占用情况

    如果你想查看所有进程的内存使用情况,可以使用命令procrank.dumpsys meminfo查看,当然也只可以过滤出某个进程如:dumpsys meminfo | grep -i phone 先来 ...

  2. 多线程网页爬虫 python 实现(二)

    #!/usr/bin/env python #coding=utf-8 import threading import urllib import re import time cur=0 last= ...

  3. Mac 下配置 Cocos2d-x 3-x android 的环境

    本人初学Cocos2d 3-x,环境配置,搭建android环境弄了好长时间,走了不少弯路,翻阅了好多人的博客和文档,包括官方文档讲的似乎有些似懂非懂,好多依然是旧的版本,所以把我的整个过程梳理一下. ...

  4. C#文件的压缩和解压(ZIP)使用DotNetZip封装类操作zip文件(创建/读取/更新)实例

    需要引用Ionic.Zip命名空间 DLL下载地址在这里:http://dotnetzip.codeplex.com/ 文件压缩 /// <summary> /// 压缩ZIP文件 /// ...

  5. FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)

    一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数.后一种方式对于使用Zookeeper等加载属性的方式很方便. 1. 加载配置文件: ...

  6. 【iOS开发系列】cell切割线置顶

    废话不多说,直接上代码: /** * tableViewCell切割线左側置顶 < 1 > */ -(void)viewDidLayoutSubviews { if ([_tableVie ...

  7. python使用cx_oracle连接oracle数据库

    http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html---下载instantclient-basic-linux.x ...

  8. V-Play 文档翻译 Page

    V-Play 文档翻译 Page 翻译:qyvlik 应用的一个页面. VPlayApps 1.0 Inherits: MouseArea Inherited By: ListPage 属性 Item ...

  9. Web 监听器

    什么事web 监听器? Servlet规范中定义的一种特殊类 用于监听ServletContext.HttpSession和ServletRequest等象的创建与销毁的事件 用监听域对象的属性发生修 ...

  10. 运用Links方法安装插件

    方法如下: (1)在Eclipse的安装目录下新建两个文件夹:一个用来存放插件,取名为myplugins:另一个用来存放link文件,取名为links. (2)将下载的插件解压缩到myplugins目 ...