uva-10085-搜索-最远状态的八数码
直接bfs即可,取最后一个状态
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
#include <queue> using namespace std; struct Dir
{
int x, y;
}; struct Node
{
int x, y;
string str = "";
string steps = "";
};
char st[] = { 'U', 'D', 'L', 'R' };
Dir dir[] = { { , - }, { , }, { -, }, { , } }; queue<Node> q;
const int N = ;
string ans = "";
string ansStep = ""; int index(int x, int y)
{
return y * + x;
} void bfs(map<string, int> repeatMaps)
{
while (!q.empty())
{
Node node = q.front();
q.pop();
int curZero = index(node.x, node.y);
string curStr = node.str;
for(int i = ; i < ; i++)
{
int nx = node.x + dir[i].x;
int ny = node.y + dir[i].y;
if(nx < || ny < || nx > || ny > )
continue;
//nextstr
string nextStr(curStr);
swap(nextStr[index(nx, ny)], nextStr[curZero]);
if(repeatMaps.find(nextStr) == repeatMaps.end())
{
//未重复
Node n;
n.str = nextStr;
n.x = nx;
n.y = ny;
n.steps = node.steps + st[i];
q.push(n);
ans = nextStr;
ansStep = n.steps;
repeatMaps[nextStr] = ;
}
}
}
} int main()
{
freopen("d://1.text", "r", stdin);
//3x3图
//目标图
int n;
cin >> n;
int t =;
while (n--)
{
if(t!=)
cout<<endl;
string str = "";
int k;
int x, y;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
{
cin >> k;
str += k+'';
if(k == )
{
y = i;
x = j;
}
}
Node init;
init.steps = "";
init.str = str;
init.x = x;
init.y = y;
q.push(init);
map<string, int> repeatMaps;
repeatMaps[str] = ;
bfs(repeatMaps);
cout<<"Puzzle #"<<t<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
if(j!=)
{
cout<<" ";
}
cout<<ans[i*+j];
}
cout<<endl;
}
cout << ansStep << endl;
++t;
}
return ;
}
uva-10085-搜索-最远状态的八数码的更多相关文章
- HDU 1043 Eight 八数码问题 A*算法(经典问题)
HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...
- 八数码问题:C++广度搜索实现
毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...
- 关于八数码问题中的状态判重的三种解决方法(编码、hash、<set>)
八数码问题搜索有非常多高效方法:如A*算法.双向广搜等 但在搜索过程中都会遇到同一个问题.那就是判重操作(假设反复就剪枝),怎样高效的判重是8数码问题中效率的关键 以下关于几种判重方法进行比較:编码. ...
- HDU-1043 Eight八数码 搜索问题(bfs+hash 打表 IDA* 等)
题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原 ...
- HDU 1043 八数码(A*搜索)
在学习八数码A*搜索问题的时候须要知道下面几个点: Hash:利用康托展开进行hash 康托展开主要就是依据一个序列求这个序列是第几大的序列. A*搜索:这里的启示函数就用两点之间的曼哈顿距离进行计算 ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- codevs1225八数码难题(搜索·)
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Yours和zero在研究A*启 ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)
八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...
随机推荐
- ecstore-自定义app里增加对应的wap的模板
注意第二个参数空第三个参数是自定义app名称$this->page('wap/member/recmembers.html','','ecstoreapprcomp2p');
- dragino2 ar9331将LED管脚当做普通gpio使用
1. 将gpio13和gpio17也当作普通gpio使用,修改 target/linux/ar71xx/files/arch/mips/ath79/mach-dragino2.c文件如下 /* * D ...
- ueditor图片上传和显示问题
图片上传: 这段是contorller代码 @RequestMapping(value = "/uploadImg", method = RequestMethod.POST) @ ...
- 关于IP核中中断信号的使用---以zynq系统为例
关于IP核中中断信号的使用---以zynq系统为例 1.使能设备的中断输出信号 2.使能处理器的中断接收信号 3.连接IP核到处理器之间的中断 此处只是硬件的搭建,软件系统的编写需要进一步研究. 搭建 ...
- button高度改变
代码:<input type="button" name="submit" value="submit" /> 利用css改变b ...
- axios 上传图片
let data = new FormData(); for (var i = 0; i < files.length; i++) { let file = files.item(i); dat ...
- 关于linux中的system函数
Linux下使用system()函数一定要谨慎 https://blog.csdn.net/senen_wakk/article/details/51496322 system()正确应用 https ...
- Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集
ylbtech-Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集 1.返回顶部 1. Java 实例 - 数组差集 Java 实例 以下实例演示了如何使用 remo ...
- MySQL binlog 组提交与 XA(两阶段提交)--1
参考了网上几篇比较靠谱的文章 http://www.linuxidc.com/Linux/2015-11/124942.htm http://blog.csdn.net/woqutechteam/ar ...
- Hive深入学习--应用场景及架构原理
Hive背景介绍 Hive最初是Facebook为了满足对海量社交网络数据的管理和机器学习的需求而产生和发展的.互联网现在进入了大数据时代,大数据是现在互联网的趋势,而hadoop就是大数据时代里的核 ...