【题目链接】:http://acm.hdu.edu.cn/showproblem.php?pid=1043

【题意】



会给你很多组数据;

让你输出这组数据到目标状态的具体步骤;

【题解】



从12345678x这个目标状态开始bfs然后获取它能够到达的所有状态;

然后在队列中记录下执行这一步用的是那个操作;

递归输出就好;

map来判定这状态存不存在;

在队列里面存这个状态

就按照所给的存成1维的数组就好;

x用9代替;(用0也可以哦);

模拟八数码的操作就好;

因为是逆序的,所以记录的操作是相反的;

最后递归写输出的时候搞晕了;

又WA了好多次.



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 200e4;
const int chushi[10] = { 0,1,2,3,4,5,6,7,8,9 }; struct abc
{
int s[15];
int pos,ope,pre;
}; map<int, int> dic;
abc dl[N];
int ts[15];
string t; int zt(int s[15])
{
int r = 0;
rep1(i, 1, 9)
r = r * 10 + s[i];
return r;
} void bfs()
{
abc temp,temp1;
rep1(i, 0, 9) temp.s[i] = chushi[i];
temp.pos = 9;
dic[zt(temp.s)] = 1;
int head = 1, tail = 1;
dl[1] = temp;
while (head <= tail)
{
abc now = dl[head++];
int ss[15];
rep1(i, 1, 9) ss[i] = now.s[i];
int t = now.pos;
//up
if (t > 3)
{
int tt = t - 3;
swap(ss[tt], ss[t]);
int pc = zt(ss);
if (!dic[pc])
{
rep1(i, 1, 9) temp1.s[i] = ss[i];
temp1.pos = tt, temp1.pre = head - 1, temp1.ope = 2;
dl[++tail] = temp1;
dic[pc] = tail;
}
swap(ss[tt], ss[t]);
}
//down
if (t<7)
{
int tt = t + 3;
swap(ss[tt], ss[t]);
int pc = zt(ss);
if (!dic[pc])
{
rep1(i, 1, 9) temp1.s[i] = ss[i];
temp1.pos = tt, temp1.pre = head - 1, temp1.ope = 1;
dic[pc] = tail+1;
dl[++tail] = temp1;
}
swap(ss[tt], ss[t]);
}
//left
if ((t % 3) != 1)
{
int tt = t - 1;
swap(ss[tt], ss[t]);
int pc = zt(ss);
if (!dic[pc])
{
rep1(i, 1, 9) temp1.s[i] = ss[i];
temp1.pos = tt, temp1.pre = head - 1, temp1.ope = 4;
dic[pc] = tail+1;
dl[++tail] = temp1;
}
swap(ss[tt], ss[t]);
}
//right
if ((t % 3) != 0)
{
int tt = t + 1;
swap(ss[tt], ss[t]);
int pc = zt(ss);
if (!dic[pc])
{
rep1(i, 1, 9) temp1.s[i] = ss[i];
temp1.pos = tt, temp1.pre = head - 1, temp1.ope = 3;
dic[pc] = tail+1;
dl[++tail] = temp1;
}
swap(ss[tt], ss[t]);
}
}
} void pri(int now){
if (now == 1) return;
int ju = dl[now].ope;
if (ju == 1) printf("u");
if (ju == 2) printf("d");
if (ju == 3) printf("l");
if (ju == 4) printf("r");
pri(dl[now].pre);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
bfs();
while (getline(cin,t)){
int num = 0;
int len = t.size();
rep1(i,0,len-1)
{
if (t[i]=='x') t[i] = '9';
if (t[i]>='0' && t[i]<='9') ts[++num] = t[i]-'0';
if (num==9) break;
}
int pc=dic[zt(ts)];
if (pc){
pri(pc);
puts("");
}
else
puts("unsolvable");
}
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【hdu 1043】Eight的更多相关文章

  1. 【HDU - 1043】Eight(反向bfs+康托展开)

    Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8   在上图中,由于右下角位置是空的 ...

  2. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  3. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  4. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  5. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  6. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  7. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 8 种提升ASP.NET Web API性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  2. Rails5 Model Document

    创建: 2017/06/09 更新: 2017/06/21 更新: 2017/06/23 对待未完成的追加# TODO: 更新: 2017/06/29 修正文件名db/seed.rb ---> ...

  3. linux下导入oracle数据表

    提前说明:这个是默认oracle已经安装好切数据库默认表空间已经创建好.之后将数据表dmp文件直接导入到默认表空间里(默认表空间不用再指定,因为创建数据库时已经指定默认表空间) linux命令如下: ...

  4. 回调函数,回调函数使用call

    回调函数:一个函数b作为参数,给另外一个函数a使用.并且在执行a之后(注意不一定是执行完a),再去执行b这个函数. 上代码: function a(callback) { alert("我是 ...

  5. c++ memset函数

    函数名称:memset 函数所需头文件:#include<cstring> 函数作用:内存赋值函数,用来给某一块内存空间进行赋值的. 函数结构:memset(变量,一个数字,一个数字)  ...

  6. [APIO2007]动物园

    题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围栏里有一种动物. 你是动物园的公共主管.你要做的是,让每个来动物园的人都尽可能高兴.今天有一群小朋 ...

  7. Android 性能优化(7)网络优化( 3) Optimizing User-Initiated Network Use

    Optimizing User-Initiated Network Use This lesson teaches you to Pre-fetch Network Data Check for Co ...

  8. 使用JS分页 <span> beta 3.0 完成封装的分页

    <html> <head> <title>分页</title> <style> #titleDiv{ width:500px; backgr ...

  9. Kafka~服务端几个常用的命令

    在Centos上安装和部署完成kafka之后,我们就可以向服务端推消息和消费它了,今天主要聊几个常用的命令,比建立topic,从broken显示所有topics列表,向broken发消息,从broke ...

  10. sql server 行转列 要注意的问题 pivot

      select * from (  select mvqr.VoteQuestionId,mvqr.AnswerSolution from  JY_MemberVoteQuestionRef as  ...