hdu 1195 广度搜索
这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的。需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中。我做的很烦啊~~~
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int n,m;
int vi[];
struct Point{
int n,num;
Point(int x,int y)
{
vi[x]=;
n=x;
num=y;
}
int operator <(const Point &temp) const
{
return num>temp.num;
}
}p(,);
priority_queue<Point> q;
int bfs()
{
if(n==m)
return ;
while(!q.empty())
q.pop();
memset(vi,,sizeof(vi));
p.n=n,p.num=;
q.push(p);
int a,b,c,d;
while(!q.empty())
{
p=q.top();
q.pop();
if(p.n==m)
return p.num;
//cout<<p.n<<" "<<p.num<<endl;
a=p.n/;
b=(p.n/)%;
c=(p.n%)/;
d=p.n%;
//cout<<p.n<<endl;
//cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
if(a==)
{
if(!vi[+b*+c*+d])
q.push(Point(+b*+c*+d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(b==)
{
if(!vi[a*++c*+d])
q.push(Point(a*++c*+d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(c==)
{
if(!vi[a*+b*++d])
q.push(Point(a*+b*++d,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(d==)
{
if(!vi[a*+b*+c*+])
q.push(Point(a*+b*+c*+,p.num+));
}
else
if(!vi[p.n+])
q.push(Point(p.n+,p.num+));
if(a==)
{
if(!vi[+b*+c*+d])
q.push(Point(+b*+c*+d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(b==)
{
if(!vi[a*++c*+d])
q.push(Point(a*++c*+d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(c==)
{
if(!vi[a*+b*++d])
q.push(Point(a*+b*++d,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(d==)
{
if(!vi[a*+b*+c*+])
q.push(Point(a*+b*+c*+,p.num+));
}
else
if(!vi[p.n-])
q.push(Point(p.n-,p.num+));
if(!vi[b*+a*+c*+d])
q.push(Point(b*+a*+c*+d,p.num+));
if(!vi[a*+c*+b*+d])
q.push(Point(a*+c*+b*+d,p.num+));
if(!vi[a*+b*+d*+c])
q.push(Point(a*+b*+d*+c,p.num+));
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("%d\n",bfs());
}
return ;
}
hdu 1195 广度搜索的更多相关文章
- 八数码问题:C++广度搜索实现
毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...
- 记录----第一次使用BFS(广度搜索)学习经验总结
学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...
- Leetcode 课程表 C++ 图的深度搜索和广度搜索练习
广度搜索(degree) struct GraphNode{ int label; vector<GraphNode*> neighbours; GraphNode(int x):labe ...
- HDU 1195 Open the Lock (双宽搜索)
意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别 ...
- hdu 1195(搜索)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1195 Open the Lock
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...
- hdu 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5 Sample Output Case #1: ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...
随机推荐
- Java邮件服务学习之一:邮件服务概述
java可以提供邮件服务:一般理解的邮件服务就是可以发送和接收邮件的客户端,另外就是使用java编写邮件服务端:两者区别在于客户端只负责给终端客户收发邮件,就相当于小区楼下的那一排排的铁皮邮箱盒,而邮 ...
- boost::bind 和 boost::function 基本用法
这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...
- UVA 10054 The Necklace(欧拉回路,打印路径)
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- codeforces 629A Far Relative’s Birthday Cake
A. Far Relative’s Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...
- Linux下的内核测试工具——perf使用简介
Perf是Linux kernel自带的系统性能优化工具.Perf的优势在于与Linux Kernel的紧密结合,它可以最先应用到加入Kernel的new feature.pef可以用于查看热点函数, ...
- [置顶] stax解析xml文档的6种方式
原文链接:http://blog.csdn.net/u011593278/article/details/9745271 stax解析xml文档的方式: 基于光标的查询: 基于迭代模型的查找: 基于过 ...
- WinFrom界面框架之WeifenLuo.WinFormsUI.Docking + OutLookBar
本文转载:http://www.cnblogs.com/luomingui/p/3329763.html WeifenLuo.WinFormsUI.Docking + OutLookBar结合使用的效 ...
- [置顶] How to dump redo log entry?
1.转储针对特定数据块(4号文件的第10-20号数据块)修改的 redo entry select file#,name,blocks from v$datafile; FILE# NAME ...
- delphi 修改Hint的字体和颜色
//修改Hint的字体和颜色 public { Public declarations } procedure Sshowhint(var hintstr:string;var can ...
- <Android>关于EditText中setInputType和setSingleLine的冲突
近期自己开发了一个带有删除button的EditText,一方面须要设置为SingleLine,还有一方面又须要设置输入类型,起先在xml文件里设置了android:inputType类型,在自己定义 ...