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 ...
随机推荐
- Spring之FactoryBean
首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混 BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂 Fa ...
- mysql计划任务每天定时执行
代码例子:CREATE EVENT `course_listener` ON SCHEDULE EVERY DAY STARTS '2012-07-18 00:00:00' ON COMPLETION ...
- primefaces4.0基本教程以及增删改查
最近试着用了用primefaces4.0,准备写一个基本的增删改查以及分页程序,但在写的过程中发现了很多问题,本想通过百度.谷歌解决,但无奈中文资料非常少,笔者在坑中不停的打滚,终于完成了一个有着基本 ...
- HTML5音乐播放器(最新升级改造加强版)
最近么,单位里面么老不顺心的,公司一直催要程序员要PHP,然后本宅好不容易推荐了一个,我日嘞,最后待遇变成1.3,吾师最后也同意1.3W,然后还说要考虑... 尼玛,4年多5年不到一点的工作经验,前端 ...
- log4net--不可多得的开源日志记录组件
log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...
- 正确使用Python logging
这篇文章主要参考: http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python ===================== ...
- R中的name命名系列函数总结
本文原创,转载请注明出处,本人Q1273314690 R中关于给行列赋名称的函数有 dimnames,names,rowname,colname,row.names 这五个函数,初学的时候往往分不清楚 ...
- R笔记 map_leaflet googlevis
packages : map leaflet library(leaflet) library(maps) mapStates = map("state", fill = TRUE ...
- oracle数据表创建分区与查询
场景: 遇到1亿数据量的数据需要根据用户名做些数据统计分析,想直接做些聚合计算基本没可能,于是打算先根据日期按照年月创建分区,然后对各个分区分别进行统计,最后汇总结果. 有两种方法,分别是手工设置分区 ...
- 谈谈使用echarts过程中踩过的坑
小结: 1. 使用jquery获取json对象遇到的问题 由于自己对ajax用的还不熟练,之前都是拷贝别人的代码拿来用的,这次自己写的时候倒是碰到好多麻烦一一列举如下: 1.1 在$ 与ajax之间还 ...