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 ...
随机推荐
- SSH+Ext+mysql快速开发
一.需要知识点 1.SSH整合 2.EXT使用 以及深入细节点 二.小功能实现 1.Servlet实现校验码验证 2.首页布局实现 3.struts错误信息显示(struts标签使用) 4.首页整体布 ...
- Orchard源码分析(2):Orchard.Web.MvcApplication类(Global)
概述 分析一个的ASP.NET项目源码,首先可以浏览其项目结构,大致一窥项目其全貌,了解项目之间的依赖关系.其次可以浏览Web.config和Global.asax文件,找到应用程序的入口点. 本 文 ...
- C# 对象 序列化 XML
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- github常见操作和常见错误!
本人总结: 1.问题: fatal: Not a git repository (or any of the parent directories) 解决: 本地库还没有创建,请先用git init ...
- java编程中Properties类的具体作用和使用
如果不熟悉 java.util.Properties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的.(如清单 1 所示).最近更新的java.util.Properti ...
- 用jquery写循环播放div的相关笔记 珍贵的总结 -1
用jquery写循环播放div line-height应用的元素的 层次? line-heig字ht, 叫行高, 仅仅是指 文/文本, 而不管图片. line-height是容器中 文本行 与 文本行 ...
- git执行pull命令时,报错
在图形界面中,执行拉取操作时,出现下面的错误. You asked to pull from the remote 'origin', but did not specifya branch. Bec ...
- jQuery.lazyload使用及源码分析
前言: 貌似以前自己也写过图片懒加载插件,但是新公司使用的是jQuery.lazyload插件,为了更好的运用,自己还是把源码看了遍,分别记录了如何使用, 插件原理,各个配置属性的完整解释,demo实 ...
- Linq→join中指定多个条件
还是习惯先撸一段SQL * FROM User_Pic P AND P.Guid = R.UserPicGuid ORDER BY PicSize DESC 然后发现Linq中的join不能多条件.. ...
- linxu scp命令
\ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解 名称:cp 使用权限: ...