https://cn.vjudge.net/problem/HDU-3567

#include <stdio.h>
#include <math.h>
#include <queue>
#include <stack>
#include <string.h>
using namespace std;

struct Node
{
int s[9];
int loc;//存放0的位置
int state;//存放康托展开后的值
char d;
int fa;
}n[370000];
int len;
int dx[] = {1,0,0,-1};
int dy[] = {0,-1,1,0};
//按照字典序最小来搜索
char dir[] = "dlru";

int vis[9][370000];
long long path[9][370000];

int lev[] = {1,1,2,6,24,120,720,5040,40320,362880};
int cantor(int s[9])
{
int sum = 0;
for(int i = 0;i<9;i++)
{
int num = 0;
//计算逆序数
for(int j = i+1;j<9;j++)
{
if(s[j] < s[i]) num++;
}
sum+=num*lev[9 - i - 1];
}
return sum + 1;
}
void find_path(int pos,int e)
{
long long road = path[pos][e];
stack<int> sta;
int a;
for(int i = 0;i<vis[pos][e] - 1;i++)
{
a = road%4;
road = road>>2;
sta.push(a);
}
while(!sta.empty())
{
a = sta.top();sta.pop();
printf("%c",dir[a]);
}
printf("\n");

}
void bfs(int pos)
{
int head = 0,tail = 0;
n[0].fa = 0;
n[0].d = '\0';
n[0].loc = pos;
n[0].state = cantor(n[0].s);
vis[pos][n[0].state] = 1;
Node cur;
while(head <= tail)
{
cur = n[head];
//if(pos == 6) printf("Cur loc:: %d\n",cur.loc);
int x = cur.loc / 3;
int y = cur.loc % 3;
for(int i = 0 ;i < 4;i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx>=0&&ny>=0&&nx<3&&ny<3)
{
Node nex = cur;
nex.fa = head;
nex.s[cur.loc] = nex.s[nx*3 + ny];
nex.loc = nx*3 + ny;
nex.s[nex.loc] = 0;
nex.state = cantor(nex.s);

if(!vis[pos][nex.state])
{
vis[pos][nex.state] = vis[pos][cur.state] + 1;
path[pos][nex.state] = (path[pos][cur.state]<<2) + i;
//if(pos == 6) printf("Nex loc:: %d\n",nex.loc);
n[++tail] = nex;
}
}
}
head++;
}
}

void init(int pos)
{
for(int i = 0,j = 1;i<9;i++)
{
if(i == pos)//pos代表X的位置
{
n[0].s[i] = 0;//x用0表示
}
else
{
n[0].s[i] = j++;
}
}
//printf("POS :: %d\n",pos);
bfs(pos);
}

int main()
{
int T,t;
int exc[10];
char src[10];
char des[10];
memset(path,0,sizeof path);
memset(vis,0,sizeof vis);
for(int i = 0;i<9;i++)
{
init(i);
}
scanf("%d",&T);
t = T;
while(T--){
scanf("%s",src);
int pos = 0;
for(int i = 0,j = 1;i<9;i++)
{
if(src[i] == 'X'){
src[i] = '0';
pos = i;
exc[0] = 0;
}
else
{
exc[src[i] - '0'] = j++;
}
}
scanf("%s",des);
int s[9];
for(int i = 0;i<9;i++)
{
if(des[i] == 'X')
{
s[i] = 0;
}
else
{
s[i] = exc[des[i] - '0'];
}
}
int tt = cantor(s);
printf("Case %d: %d\n",t-T,vis[pos][tt] - 1);
find_path(pos,tt);
}
return 0;
}

HDU - 3567的更多相关文章

  1. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...

  2. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  3. hdu 1430+hdu 3567(预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状 ...

  4. HDU 3567 Eight II 打表,康托展开,bfs,g++提交可过c++不可过 难度:3

    http://acm.hdu.edu.cn/showproblem.php?pid=3567 相比Eight,似乎只是把目标状态由确定的改成不确定的,但是康托展开+曼哈顿为h值的A*和IDA*都不过, ...

  5. HDU 3567 Eight II

    Eight II Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 3 ...

  6. HDU 3567 Eight II BFS预处理

    题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...

  7. HDU - 3567 Eight II (bfs预处理 + 康托) [kuangbin带你飞]专题二

    类似HDU1430,不过本题需要枚举X的九个位置,分别保存状态,因为要保证最少步数.要保证字典序最小的话,在扩展节点时,方向顺序为:down, left, right, up. 我用c++提交1500 ...

  8. HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二

    这题难度颇大啊,TLE一天了,测试数据组数太多了.双向广度优先搜索不能得到字典序最小的,一直WA. 思路:利用IDA*算法,当前状态到达目标状态的可能最小步数就是曼哈顿距离,用于搜索中的剪枝.下次搜索 ...

  9. Eight II HDU - 3567

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

随机推荐

  1. adv生成控制器手腕位置倾斜原因以及解决方案

    系统默认问题导致手腕倾斜详情描述: 手腕部分默认生成轴向是冲向模板下一层级第一个物体  简单说就是 FK轴向冲向模板中指方向 如图 默认模板没问题是因为  默认模板没有改动情况下系统中指与手腕在一条直 ...

  2. ECharts 从后台动态获取数据 (asp.net)

    (一) 使用工具 visual studio 2017:Web开发:asp.net (代码中的js引用路径以及ajax方法调用的url,记得修改哦) (二) 准备工作(此处写给和我一样小白) 1.动态 ...

  3. Android L2TP Client Setup

    原文链接:http://www.softether.org/4-docs/2-howto/9.L2TPIPsec_Setup_Guide_for_SoftEther_VPN_Server/3.Andr ...

  4. ubuntu 主题和zsh终端

    ubuntu 主题和zsh终端 1) sudo apt-get install unity-tweak-tool  sudo add-apt-repository ppa:noobslab/theme ...

  5. nexus 数据库备份任务webhook 通知-另外一种方法

    使用benthos 做为webhook,是一种方法,功能很强大,但是有点复杂,所以换了一个更简单直接的webhook 工具 根据请求的数据,只处理关于db exporter 任务部分的消息,然后就是调 ...

  6. The Best Books on Game Dev

    https://www.goodreads.com/list/show/99288.The_Best_Books_on_Game_Dev

  7. 亲测实验,stm32待机模式和停机模式唤醒程序的区别,以及唤醒后程序入口

    这两天研究了STM32的低功耗知识,低功耗里主要研究的是STM32的待机模式和停机模式.让单片机进入的待机模式和停机模式比较容易,实验中通过设置中断口PA1来响应待机和停机模式. void EXTI1 ...

  8. Git 日常操作

    本地新建Git库步骤: 初始化git库:git init 建立本地和远程的关联: git remote add origin ip:端口/ 项目.git 从远程下载所有分支到本地:git  fetch ...

  9. 多次ajax请求数据json出错!!

    问题描述: 1.对象数据存放在session中,每次从session中取数据 2.jsp初始化完毕调用ajax请求,返回的数据格式出错(返回部分数据,即丢失了部分数据) 解决方案:

  10. AttributePriority

    还有AttributePriority,我们可以设置编译时优先级.如果我们对目标标记了多个aspect,这样postsharp就不确定注入先后顺序,这样不能确保正确性,在vs编译时候我们会看见警告:T ...