[HDU1195]Open the Lock
题目大意:给你一个4位数的初始状态(只包含1~9),要求你变化成另一个4位数。
变化规则为:每次可给任意一位加1或减1(1减1变为9,9加1变为1),或交换相邻两个数位上的数字(第一位和最后一位不相邻)。
要你求出最少的变化次数。
解题思路:这道题很明显是一道BFS的题,只不过变化的操作复杂了点。我使用了字符串进行处理。
一开始我用的是STL的string,后来我改成了C字符串,对比如下:

这充分说明了string的慢。。
操作虽然复杂,但耐心点还是能写好的。
具体见代码。
C++ Code:
#include<cstdio>
#include<string.h>
#include<stdlib.h>
using namespace std;
char n[5],m[5];
struct sss{
int a;
char s[5];
};
sss d[9002];
bool b[10001];
const int dd[]={1,-1};
void bfs(){
int l=0,r=1;
memset(b,0,sizeof(b));
d[1].a=0;
strcpy(d[1].s,n);
while(l!=r){
l=l%9000+1;
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(j!=2){
char c[5];
strcpy(c,d[l].s);
c[i]+=dd[j];
if(c[i]=='0')c[i]='9';
if(c[i]>'9')c[i]='1';
int f=atoi(c);
if(!b[f]){
b[f]=1;
r=r%9000+1;
strcpy(d[r].s,c);
d[r].a=d[l].a+1;
if(strcmp(c,m)==0){
printf("%d\n",d[r].a);
return;
}
}
}else{
for(int k=0;k<=2;k++){
char c[5];
strcpy(c,d[l].s);
char f=c[k];
c[k]=c[k+1];
c[k+1]=f;
int ll=atoi(c);
if(!b[ll]){
b[ll]=1;
r=r%9000+1;
strcpy(d[r].s,c);
d[r].a=d[l].a+1;
if(strcmp(c,m)==0){
printf("%d\n",d[r].a);
return;
}
}
}
}
}
}
int main(){
int o;
scanf("%d",&o);
while(o--){
scanf("%s",n);
scanf("%s",m);
if(strcmp(n,m)==0){
puts("0");
continue;
}
bfs();
}
}
[HDU1195]Open the Lock的更多相关文章
- hdu1195 Open the Lock (DFS)
Problem Description Now an emergent task for you is to open a password lock. The password is consist ...
- Open the Lock[HDU1195]
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- ACM-BFS之Open the Lock——hdu1195(双向BFS)
这道题的0基础版本号,暴力BFS及题目详情请戳:http://blog.csdn.net/lttree/article/details/24658031 上回书说道,要用双向BFS来尝试一下. 最终A ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- 多线程同步工具——Lock
本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- InnoDB:Lock & Transaction
InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...
- 使用四元数解决万向节锁(Gimbal Lock)问题
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...
- 万向节锁(Gimbal Lock)的理解
[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...
随机推荐
- awk的总结
入门总结 Awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告.处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可 ...
- DOM中元素节点,属性节点,文本节点的理解
节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是: nodeName(节点名称) nodeValue(节点值) nodeType(节点类型) nodeType nodeType 属性可 ...
- 警告: The APR based Apache Tomcat Native library failed to load.
警告: The APR based Apache Tomcat Native library failed to load. The error reported was [C:\apache-tom ...
- wifi共享精灵2014.04.25.001已经更新,wifi热点中文名走起!
五一回来后,有个惊喜,wifi共享精灵有了最新动向.不晓得wifi共享精灵是啥的朋友,我来解释下,它就相当于一个无线路由器.说起来,Wifi共享精灵正式版2014.04.25.001(http://w ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序 非常多开 ...
- Unity3D中C#和JS的方法互相調用
因为Unity3D中一些腳本的方法仅仅能用在JS中.在C#中是無效的,而C#能够與服務器端通訊,JS本身卻不行.所以勢必會遇到這兩種語言腳本中方法的互相調用,下面是演示样例. 兩個文件 test1.j ...
- 使用rsync同步数据(by quqi99)
作者:张华 发表于:2015-12-28版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 急需使 ...
- [JavaEE]Hibernate 所有缓存机制详解
Hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...
- kafka windows安装 命令行下使用测试
1.zookeeper安装: (https://zookeeper.apache.org/releases.html) ①进入zookeeper的相关设置所在的文件目录,例如本文的:D:\bigd ...
- 13. Roman to Integer[E]罗马数字转整数
题目 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...