【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 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- 再谈 webpack build 及 加载优化
之前项目多,事情忙,一直没时间写博客,现在空闲下来了,总结一下 之前讲过了关于 build 压缩文件的方法,有兴趣的可以看下: 点击查看 现在讲讲一个页面的首屏加载速度该如何提升 提前说明 需要 we ...
- BFS HDOJ 1728 逃离迷宫
题目传送门 /* BFS:三维BFS,加上方向.用dp[x][y][d]记录当前需要的最少转向数 */ #include <cstdio> #include <algorithm&g ...
- ACM_区间调度问题(贪心)
Meetings 系列一 Time Limit: 2000/1000ms (Java/Others) Problem Description: 多年之后的广财ACM编协如日中天,下系多个部门,且编协成 ...
- C#模拟百度登录并到指定网站评论回帖(五)
前面的四篇已经说完了全部的模拟百度登录,接下来就是到指定的网站去发表评论,当然你也可能是获取其他信息,其实这些套路都是万变不离其宗的,弄懂之后觉得像这种请求-响应获取信息的功能实在很简单(想起当初走的 ...
- Debug技巧(1)
首先声明,以下有些是自己遇到的问题自己解决了,其它里面包括了网上看到的Debug经验和书里看到的经验,时间问题就不一一说明,如有侵权,私信我进行删除,我会道歉.我写这个的本意是记录我学习中遇到的问题, ...
- Python学习日记之正则表达式re模块
用在线网页测试正则表达式时,JavaScript不支持 零宽度正回顾后发断言 (?<=exp)测试时一直匹配失败 但re模块是支持 (?<=exp) 的 终于脱坑
- Python自动监控错误日志
平时在查看日志的时候打开满屏的日志,看上去有点凌乱.于是写个Python脚本过滤出想要看的错误的日志.直接上脚本 脚本示例 def read_log(logname,keyword): tell = ...
- Python代码搜索并下载酷狗音乐
运行环境: Python3.5+Pycharm 实例代码: import requests,re keyword = input("请输入想要听的歌曲:") url = " ...
- Python中*args和**kwargs的使用
函数定义 使用*args和**kwargs传递可变长参数: *args用作传递非命名键值可变长参数列表(比如元组) **kwargs用作传递键值可变长参数列表(比如字典) 函数入参 *args 传递一 ...
- python自动化--语言基础四模块、文件读写、异常
模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...