八数码难题 双向搜索(codevs 1225)
Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.
问题描述
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入初试状态,一行九个数字,空格用0表示
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
283104765
4
/*
第一次写双向宽搜,没什么经验,刚开始自己用两个数组搞了将近两个小时,后来问ylf大神,他用一个队列,并且用map省去了hash判重,代码简洁美观…………
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<map>
#include<string>
using namespace std;
map<string,int> f,step;
queue<string> q;
string s,t="";
void BFS()
{
f[s]=;f[t]=;
step[s]=;step[t]=;
q.push(s);q.push(t);
while(!q.empty())
{
string k=q.front();
q.pop();
int p=k.find('');
if(p>)//向上搜索
{
int pp=p-;
string kk=k;
swap(kk[p],kk[pp]);
if(!f[kk]){q.push(kk);f[kk]=f[k];step[kk]=step[k]+;}
else if(f[kk]!=f[k]){printf("%d",step[kk]+step[k]+);return;}
}
if(p<)//向下搜索
{
int pp=p+;
string kk=k;
swap(kk[p],kk[pp]);
if(!f[kk]){q.push(kk);f[kk]=f[k];step[kk]=step[k]+;}
else if(f[kk]!=f[k]){printf("%d",step[kk]+step[k]+);return;}
}
if(p!=&&p!=&&p!=)//向左搜索
{
int pp=p-;
string kk=k;
swap(kk[p],kk[pp]);
if(!f[kk]){q.push(kk);f[kk]=f[k];step[kk]=step[k]+;}
else if(f[kk]!=f[k]){printf("%d",step[kk]+step[k]+);return;}
}
if(p!=&&p!=&&p!=)//向右搜索
{
int pp=p+;
string kk=k;
swap(kk[p],kk[pp]);
if(!f[kk]){q.push(kk);f[kk]=f[k];step[kk]=step[k]+;}
else if(f[kk]!=f[k]){printf("%d",step[kk]+step[k]+);return;}
}
}
}
int main()
{
cin>>s;s=" "+s;
if(s==t){printf("");return ;}
BFS();
return ;
}
八数码难题 双向搜索(codevs 1225)的更多相关文章
- 八数码难题 (codevs 1225)题解
[问题描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局( ...
- 双向广搜+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*启发式算法.拿到一道经典的 ...
- codevs1225八数码难题(搜索·)
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来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
随机推荐
- AJPFX关于学习java遇到的问题:对算法和数据结构不熟悉
为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上. 既然“数据结构和算 ...
- ag-grid-vue 本地删除,不重新刷新数据
// 这是本地删除,不重新刷新数据 that.gridListOptions.api.updateRowData({ remove: [that.submitTransmitData] });
- 类似QQ在线离线好友界面
把头像设置成圆形的代码如下: package com.example.lesson6_11_id19; import android.content.Context; import android.c ...
- vscode 打开新文件不替换旧文件
设置 "workbench.editor.enablePreview": false
- 转行做web前端,该如何进行短期快速自学,达到高新就业水平
就目前来说,毕业生如果想毕业就找到高薪的工作,互联网成为了第一个选择,在所有的职业中,不靠任何关系,全凭自己的能力就业,就是程序开发,而web前端开发是目最很热门的行业,在未来五年之内,web前端开发 ...
- js实现复制input的value到剪切板
<button class="button-code button-copy">复制链接</button><script> $(".b ...
- python:第一章
完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. 代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要1 ...
- 制作SD更新系统时和用mfgtool工具烧录时,文件如何替换?
制作SD更新系统时和用mfgtool工具烧录时,文件如何替换? 答:制作SD更新系统时,请按照需求选择不同mfgimages-myd*文件夹.每个文件夹里面有一个Manifest文件, 里面规定了ub ...
- c/s端测试——nw.js篇(selenium工具)
最近在为兄弟部门开发自动化测试工具. 然后才知道现在竟然有JS工具可以把JS打包成cs端程序了,太牛了,js发展是真快.并且还是跨平台的,mac.windows.linux都支持. 当然,今天不是说n ...
- 暴力破解UltraEdit
使用x32dbg(x64dbg)做为破解工具: 使用x64dbg 打开 udeit64.exe 点击运行,直到UltraEdit启动,转到符号页: 找到: CheckForUpdatesNoPromp ...