hdu 1195
题意:就是给你n组的四位数,在一次变化中又一位数字可以变化,而变化的方式为加一减一或者是与隔壁的互换,注意,是每一个数字都可以,
求最少的变化次数到达目标的数字
一看这个就应该知道这是一个bfs的题目,广搜么,不过要注意的就是标记,不然很有可能也出不来
我的代码写的比较繁琐,也比较糙,这个写的太复杂了,不过你也可以用循环来代替我的大部分代码,可以减少很多的书写量
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue> using namespace std;
int ans; queue<int >s; bool mark[];
int step[]; int bfs(int x)
{
int he,y,c[];while(!s.empty()) s.pop();
if(x==ans) return ;
s.push(x);
mark[x]=false;
while(!s.empty())
{
he=s.front();
s.pop();
c[]=he/; //这个的目的就是判断每一位数字是否为9或者1,因为9加1就是1了,而1减1也会变成9,
c[]=(he-c[]*)/;
c[]=(he-c[]*-c[]*)/;
c[]=he%;
if(c[]==&&mark[he-]){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
else if(mark[he+]&&c[]!=){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}} //切记这里要加一个那位数不能为9或者1,否则可能出现3位数的情况
if(c[]==&&mark[he-]){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
else if(mark[he+]&&c[]!=){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
if(c[]==&&mark[he-]){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
else if(mark[he+]&&c[]!=){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
if(c[]==&&mark[he-]){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
else if(mark[he+]&&c[]!=){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
if(c[]==&&mark[he+]){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
else if(mark[he-]&&c[]!=){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
if(c[]==&&mark[he+]){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
else if(mark[he-]&&c[]!=){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
if(c[]==&&mark[he+]){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
else if(mark[he-]&&c[]!=){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
if(c[]==&&mark[he+]){s.push(he+);mark[he+]=false;step[he+]=step[he]+;if(he+==ans){printf("%d\n",step[he+]);return ;}}
else if(mark[he-]&&c[]!=){s.push(he-);mark[he-]=false;step[he-]=step[he]+;if(he-==ans){printf("%d\n",step[he-]);return ;}}
y=c[]*+c[]*+c[]*+c[]; //这个就是与隔壁的交换,只有三种情况,就是每一个都与右边的交换。
if(mark[y]){s.push(y);mark[y]=false;step[y]=step[he]+;if(y==ans){printf("%d\n",step[y]);return ;}}
y=c[]*+c[]*+c[]*+c[];
if(mark[y]){s.push(y);mark[y]=false;step[y]=step[he]+;if(y==ans){printf("%d\n",step[y]);return ;}}
y=c[]*+c[]*+c[]*+c[];
if(mark[y]){s.push(y);mark[y]=false;step[y]=step[he]+;if(y==ans){printf("%d\n",step[y]);return ;}}
if(he==ans)
{
printf("%d\n",step[he]);
return ;
}
}
return ;
} int main()
{
int n,start;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d",&start,&ans);
memset(mark,true,sizeof(mark));
memset(step,,sizeof(step));
step[start]=;
bfs(start);
}
return ;
}
hdu 1195的更多相关文章
- hdu 1195 Open the Lock
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...
- hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1195 Open the Lock(广搜,简单)
题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...
- hdu 1195 广度搜索
这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的.需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中.我做的很烦啊~~~ #include&l ...
- HDU 1195 Open the Lock (双宽搜索)
意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别 ...
- hdu 1195 Open the Lock (BFS)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1195(搜索)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU题解索引
HDU 1000 A + B Problem I/O HDU 1001 Sum Problem 数学 HDU 1002 A + B Problem II 高精度加法 HDU 1003 Maxsu ...
随机推荐
- python 正则,常用正则表达式大全
Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号: 改符号开始 从 ...
- C# ManualResetEvent和AutoResetEvent 使用笔记
一.两者区别 1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程.需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne ...
- Java Runtime.availableProcessors()方法
Java Runtime.availableProcessors()方法用法实例教程. 描述 java.lang.Runtime.availableProcessors() 方法返回到Java虚拟 ...
- Struts2 action的单例与多例
struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象.原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面 ...
- ng指令之 ng-repeat 篇
1>数据绑定 ng-repeat可以绑定数组和JSON对象数据.从下图可以看出控制器的scope()函数得到的对象与controller('ctrlName',['$scope',fun ...
- 如何在JDK1.8中愉快地处理日期和时间
如何在JDK1.8中愉快地处理日期和时间 JDK1.8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了. ...
- shell编程中的select用法
select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...
- ls按时间排序输出文件列表
文件转自:http://www.2cto.com/os/201303/197829.html ls按时间排序输出文件列表 首先,ls --help查看ls相关的与时间排序相关的参数: > ...
- Max Degree of Parallelism最大并行度配置
由于公司的业务在急速增长中,发现数据库服务器已经基本撑不住这么多并发.一方面,要求开发人员调整并发架构,利用缓存减少查询.一方面从数据库方面改善并发.数据库的并行度可设置如下: 1)cost thre ...
- iOS开发——高级篇——内存分析,Instruments
一.内存分析 1.静态内存分析(Analyze)不运行程序,直接对代码进行内存分析,查看代码是否有内存泄露优点:分析速度快,并且可以对所有的代码进行内存分析缺点:分析结果不一定准确(没有运行程序,根据 ...