【hdu 1043】Eight
【题目链接】: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的更多相关文章
- 【HDU - 1043】Eight(反向bfs+康托展开)
Eight Descriptions: 简单介绍一下八数码问题:在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的 ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【HDU 3068】 最长回文
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...
- 【HDU 4699】 Editor
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- IE6的3像素BUG产生条件及解决方法
1.IE6中第一个元素浮动第二个元素不浮动,这两个元素之间就会产生3像素BUG 2.解决方案: 2.1若若宽度一定则给第二个元素添加 float 样式即可: 2.2若宽度自适应: 2.2.1 _ma ...
- 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [ [ 1, 5, 9], [ ...
- virtualwrapper使用
1.创建: mkvirtualenv 虚拟环境目录 2.查看虚拟环境 workon lsvirtualenv 3.进入虚拟环境 workon 虚拟环境目录 4.退出虚拟环境 deactivate 5. ...
- 20 如何在C#中存一批数据,数组
使用软件的一个重要原因,是因为软件可以帮我们重复处理很多事情.在前面我们已经讲到了循环.循环就是为了重复处理一个事情.那么我们有没有想过,我们要重复处理的一批数据怎么在程序里存放呢? 举个例子吧. 我 ...
- .Net实战之反射操作篇
1.上一讲中描述了反射中常见的类,仅仅是描述类与反射之间的关系. 但是实际是对数据的操作, 在反射中,数据如何操作? [MyTable("T_UserInfo")] publ ...
- python 正则表达式操作
正则表达式操作 本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用特殊的 ...
- 我的DBDA类
<?php class DBDA { public $host="localhost"; public $uid="root"; public $pwd= ...
- Java 基础入门随笔(4) JavaSE版——程序流程控制
上一节对于运算符有了大致的了解,这一节针对程序流程控制进行复习!程序流程控制包括顺序结构.判断结构(if).选择结构(switch).循环结构. 1.判断结构 ①if语句的第一种格式: ...
- Python 开发初识
从今天开始记录自己的python开发之路,用博客记录自己的学习经历,以及学习小结,小的项目模块,努力充实,做最好的自己!!!
- 三维重建:GitHub百度Apollo 2.0
GitHub:https://github.com/ApolloAuto/apollo 1. 关于Apollo的数据:Apollo的数据会如何开放? 自动驾驶数据将包括具有高分辨率图像和像素级别标注的 ...