POJ3221 Diamond Puzzle(BFS:最短路)
来源:互联网 发布:js 变量字符串拼接 编辑:程序博客网 时间:2024/04/29 01:30
POJ3221 Diamond Puzzle(BFS:最短路)
http://poj.org/problem?id=3221
题意:
如下的平面魔方,现在给你一个魔方的初态,比如3图,要你算出从3图移动到2图的状态需要多少步。其中每步移动只能交换空格(0那格)与它相邻的格子的内容。
分析:
首先我们要想好怎么表示一个状态,我们用一个人char s[10]来表示状态,比如2图的状态是0123456.
然后我们用BFS扩展队列中节点的后续状态,并且计算到新状态的最短距离。但是这里我们还需要判断新状态以前是否出现过,所以我们用hash表来判重,其实与前几道题目基本是一样的思路,不过就是改了下数据形式。hash表我们可以自己实现,也可以直接用STL中的map<string,int>hash来表示。
注意:由于题目有很多组数组,所以我们事先求出从0123456到所有可能状态的距离,然后对于题目的每个询问输出即可。(否则超时)
本题我用的是STL中的map来作为hash查重,且用的STL中的queue,没有自己写hash和队列,代码短了(正常情况下本题应该在100行代码以上,但是下面只写了60几行),速度也不慢,关键错误少了,直接一次AC。STL中的东西在一定情况下还是推荐使用的。
AC代码:
#include<cstring>#include<cstdio>#include<string>#include<map>#include<queue>using namespace std;const int maxn=10000;int d[7][5]={{2,4,6,-1},{2,6,-1},{0,1,3,-1},{2,4,-1},{0,3,5,-1},{4,6,-1},{0,1,5,-1}};//d[i][j]=x 表示原始标记的i格能与原始标记的x格交换map<string ,int> vis;//判断当前状态是否出现过,map中的int初值为0,也即如果对应string不存在,那么就是int为0值map<string ,int> ans;//当前状态出现的最小操作步数struct Node{ char s[10];//保存状态 int dist;//最小步数};queue<Node> Q;char s[10]="0123456";void BFS(){ Node node1; strcpy(node1.s,s); node1.dist=0; Q.push(node1); ans[string(s)]=0; vis[string(s)]=1; while(!Q.empty()) { Node node=Q.front();Q.pop(); int pos;//pos表状态中0的位置 for(int i=0;node.s[i];i++)if(node.s[i]=='0') {pos=i; break;} for(int i=0;d[pos][i]!=-1;i++)//依次遍历当前0位置能交换的对应位置 { int npos=d[pos][i];//pos能交换的对应位置为npos Node node2= node; node2.s[pos]=node.s[npos]; node2.s[npos]=node.s[pos]; node2.dist =1+node.dist; if(vis[string(node2.s)]==0)//此状态之前未出现过 { vis[string(node2.s)]=1; ans[string(node2.s)]=node2.dist; Q.push(node2); } } }}int main(){ BFS(); int T; scanf("%d",&T); while(T--) { char str[10]; scanf("%s",str); if(strcmp(str,s)==0) printf("0\n"); else printf("%d\n",ans[string(str)]==0?-1:ans[string(str)]); } return 0;}
0 0
- POJ3221 Diamond Puzzle(BFS:最短路)
- poj 3221 Diamond Puzzle (BFS)
- poj 3221Diamond Puzzle(bfs+状压)
- POJ 3221 Diamond Puzzle(BFS)
- poj 3221 Diamond Puzzle 反向bfs
- POJ 3221:Diamond Puzzle(六数码 反向bfs)
- bfs最短路
- hdu1548 最短路/BFS
- BFS最短路路径
- hdu2433 BFS最短路
- POJ 3221 Diamond Puzzle.
- POJ3221
- poj3221
- HDU 4171 bfs&&最短路
- hdu 1245(最短路+bfs)
- uva11624 fire bfs 最短路
- hdu 1548 最短路||bfs
- poj3026Borg Maze(bfs+最短路)
- 关于SCRIPT5022: QuotaExceededError错误,从发现到解决
- 远程用户连接mysql,mysql授权远程连接
- 利用Java反射机制模拟框架利用类加载器加载配置文件
- 【Linux之路】命令篇
- linux 学习笔记
- POJ3221 Diamond Puzzle(BFS:最短路)
- [BEGIN-2] 序列求和
- ASIHTTPReques用法
- 【Leetcode】Valid Parentheses
- json and ajax code Memo...
- 操作系统总结之虚存
- android将文件编译到文件系统中
- Linux下安装jdk1.7和eclipse
- Poj 3276 Face The Right Way