「LuoguP1379」 八数码难题(迭代加深
题目描述
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入输出格式
输入格式:
输入初始状态,一行九个数字,空格用0表示
输出格式:
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
输入输出样例
4
题解
当迭代加深练手题做的。
这题叭也没什么好讲的,就是搜哇搜哇就行啦
/*
qwerta
P1379 八数码难题
Accepted
100
代码 C++,1.06KB
提交时间 2018-10-01 21:50:56
耗时/内存
2106ms, 816KB
*/
/*
这中间的状态记录把九宫格如下编号:
1 2 3
4 5 6
7 8 9
*/
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define LL long long
int dep;//限制深度
int a[];//把状态拆开之后放这儿
int chai(int x)//拆!
{
int ret;//记一下0在哪儿
for(register int i=;i>=;--i)
{
if(x%==)ret=i;
a[i]=x%;
x/=;
}
return ret;
}
LL ans=;//目标态
LL sub()//把拆开的压起来
{
LL x=;
for(register int i=;i<=;++i)
x=x*+a[i];
return x;
}
void dfs(int k,int d,int bef)// k:0在哪儿 d:当前深度 bef:上一次的操作
{
if(sub()==ans){cout<<d-;exit();}//找到了就输出
if(d>dep)return;//超过限定深度啦
//mvup 把空格往上移
if(k>&&bef!=){swap(a[k-],a[k]);dfs(k-,d+,);swap(a[k-],a[k]);}
//mvdown 把空格往下
if(k<&&bef!=){swap(a[k+],a[k]);dfs(k+,d+,);swap(a[k+],a[k]);}
//mvleft 往左
if(k%!=&&bef!=){swap(a[k-],a[k]);dfs(k-,d+,);swap(a[k-],a[k]);}
//mvright 往右
if(k%!=&&bef!=){swap(a[k+],a[k]);dfs(k+,d+,);swap(a[k+],a[k]);}
}
int main()
{
//freopen("a.in","r",stdin);
LL x;
cin>>x;
dep=;
while()
{
++dep;//迭代加深
int k=chai(x);
dfs(k,,);
}
return ;
}
「LuoguP1379」 八数码难题(迭代加深的更多相关文章
- 「 Luogu P1379 」 八数码难题
# 解题思路 这题不难,主要就是考虑如何判重,如果直接在 $9$ 个位置上都比较一遍的话.你会得到下面的好成绩 所以考虑另一种方法: 将九个位置压成一个整数,并且因为只有九个数,所以不会超出 $int ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
随机推荐
- OpenGL - Tessellation Shader 【转】
http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...
- cas单点登录 deployerConfigContext.xml正确配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- sql的一些知识_通配符
like操作符 通配符只能用于字符串查询 % 指任意字符出现任意次数,包括0次,不包括NULL SELECT username,weight,age FROM userinfo WHERE usern ...
- c# 时间相关
1.求时间差,两种方式(时间是否小于1800秒) 第一种: DateTime startTime = DateTime.Now; ... DateTime.Now.Subtract(startTime ...
- css hack(部分)
一.去掉图片间隙:hack1.img{ display:block: }hack2.将<div></div>与<img>写在同一行 二.ie6双倍浮向(双倍边距)出 ...
- 怎样在C语言里实现“面向对象编程”
有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...
- restframework-总结
1. 规范 - 版本控制 - 部署专用的域名(防止跨域攻击) - 因为restframework又称为面向资源的编程所以url名词需要用专业的名词去表示 - 请求方式method - url上可以传递 ...
- kubernetes故障现场一之Orphaned pod
系列目录 问题描述:周五写字楼整体停电,周一再来的时候发现很多pod的状态都是Terminating,经排查是因为测试环境kubernetes集群中的有些节点是PC机,停电后需要手动开机才能起来.起来 ...
- React_Redux_Router
一.react_redux 比较好的blog: blog1, blog2, blog3 主要根据前两个blog总结如下: 1. React在组件内部(包括子组件)为单向数据流且自上向下通过props传 ...
- 【BZOJ3782】上学路线 组合数+容斥+CRT
[BZOJ3782]上学路线 Description 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不 ...