题意:就是给你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的更多相关文章

  1. hdu 1195 Open the Lock

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1195 Open the Lock Description Now an emergent task f ...

  2. hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...

  3. hdu 1195:Open the Lock(暴力BFS广搜)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. hdu 1195 Open the Lock(广搜,简单)

    题目 猜密码,问最少操作多少次猜对,思路很简单的广搜,各种可能一个个列出来就可以了,可惜我写的很搓. 不过还是很开心,今天第一个一次过了的代码 #define _CRT_SECURE_NO_WARNI ...

  5. hdu 1195 广度搜索

    这题我们可以用优先队列,每次弹出队列中操作次数最少的一个,那么当找到匹配数时,该值一定是最优的.需要注意的时,加个vi[]数组,判读当前数是否已经存在于队列中.我做的很烦啊~~~ #include&l ...

  6. HDU 1195 Open the Lock (双宽搜索)

    意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别 ...

  7. hdu 1195 Open the Lock (BFS)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. hdu 1195(搜索)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. HDU题解索引

    HDU 1000 A + B Problem  I/O HDU 1001 Sum Problem  数学 HDU 1002 A + B Problem II  高精度加法 HDU 1003 Maxsu ...

随机推荐

  1. Spring系列之基本配置

    一.概述Spring是一个轻量级的Java开源框架,是为了简化企业级系统开发而诞生的.Spring的核心是控制反转(IOC)和面向切面编程(AOP).主要有以下几个特点:(1)轻量:从大小和开销两方面 ...

  2. StringUtils

    StringUtils.hasText(字符串) 如果字符串里面的值为null, "", "   ",那么返回值为false:否则为true

  3. asp.net mvc 4 高级编程学习笔记:第三章 视图(1)

    1.基础规则 视图的职责是向用户提供用户界面. 视图位于View目录下:有普通的需要控制器渲染的视图,有局部视图,有布局视图等各种视图. 2.视图渲染 控制器默认情况下渲染与控制器同名的目录内的与Ac ...

  4. 基本linux命令

    1.mkdir mkdir 创建目录   mkdir -p 循环创建目录 2.cd     切换目录 3.pwd   查看当前路径 4.mkdir 删除一个空的目录 5.cp 复制文件/目录  -r用 ...

  5. 安装好Android Studio(如果内存足够可以改下as的内存)

    找到studio的bin目录,找到如下文件

  6. SQL 分组去重

    select * from (select p.province_name, p.province_code, c.city_name, c.city_code, c.city_id, ROW_NUM ...

  7. Todd's Matlab讲义第4讲:控制误差和条件语句

    误差和残量 数值求解方程\(f(x)=0\)的根,有多种方法测算结果的近似程度.最直接的方法是计算误差.第\(n\)步迭代结果与真值\(x^\*\)的差即为第\(n\)步迭代的误差: \begin{e ...

  8. PHP文件操作 读取与写入

    基本知识: PHP文件系统是基于Unix系统的 文件数据基本类型:二进制数据.文本数据 文件输入流:数据从源文件到内存的流动 文件输出流:数据从内存保存到文件的流动 文件操作函数: >>& ...

  9. 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛

    题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ...

  10. SRM 513 2 1000CutTheNumbers(状态压缩)

    SRM 513 2 1000CutTheNumbers Problem Statement Manao has a board filled with digits represented as St ...