题目大意:给你一个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的更多相关文章

  1. hdu1195 Open the Lock (DFS)

    Problem Description Now an emergent task for you is to open a password lock. The password is consist ...

  2. Open the Lock[HDU1195]

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

  3. ACM-BFS之Open the Lock——hdu1195(双向BFS)

    这道题的0基础版本号,暴力BFS及题目详情请戳:http://blog.csdn.net/lttree/article/details/24658031 上回书说道,要用双向BFS来尝试一下. 最终A ...

  4. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  5. 多线程同步工具——Lock

    本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...

  6. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  7. InnoDB:Lock & Transaction

    InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...

  8. 使用四元数解决万向节锁(Gimbal Lock)问题

    问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...

  9. 万向节锁(Gimbal Lock)的理解

    [TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...

随机推荐

  1. Nginx 配置 Gzip 压缩

    打开配置文件 /etc/nginx/nginx.conf,取消掉以下的注释项: #gzip on; 取消后: gzip on; 在此配置后加上以下内容: gzip on; gzip_vary on; ...

  2. PHP面向对象(二)

    7 多态 多态: 多种形态 多态分俩种: 方法重写和方法加载 7.1 方法重写 子类重写了父类的同名的方法 <?php class Person{ public function show(){ ...

  3. Oracle-定时任务

    PLSQL->新建->命令行窗口 --存储过程 create or replace procedure prd_remove_error_data AS BEGIN UPDATE rpt_ ...

  4. spring容器启动过程理解

    一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...

  5. 【解决方法】UITableView 性能优化笔记

    1.网络图片异步载入,SDWebImage. 2.文字直接 drawInRect/drawAtPoint 绘制,參考 ABTableViewCell.AdvancedTableViewCells. 3 ...

  6. 人人都能当大厨的语音做菜神器——demo试用

    开发一款语音做菜软件的想法在我脑海里闪烁了非常久,一直苦于没有时间.趁着这几天老板的项目接近了尾声,我也有时间把我当初的想法付诸于实践. 可能有朋友对我的想法还不甚了解,我这里简介一下,具体的介绍就请 ...

  7. 鸟哥Linux私房菜知识点总结3到5章

    感觉自己对Linux的理解一直不够,所以近期翻看了一本<鸟哥的Linux私房菜>.这是一本基础的书,万丈高楼平地起,会的不多但能够学.这是我整理的一些知识点,尽管非常基础.希望和大家共同交 ...

  8. SharePoint 创建网站地图树视图及格式枚举截图

    SharePoint 创建网站地图树视图及格式枚举截图         SharePoint首页隐藏掉左側导航以后,假设要以树视图呈现站点地图也非常easy.         仅仅须要复制v4.mas ...

  9. 基本类型转换成NSNumber类型

    int i=100; float f=2.34; NSNumber *n1=[NSNumber numberWithInt:i]; NSNumber *n2=[NSNumber numberWithF ...

  10. VS头部自动注释

    1.找你的vs安装目录, 比如我的是在D盘D:\Program Files\Microsoft\VS2013\Common7\IDE 2.然后点击右上角的 搜索. 搜索Class.cs文件 3.把里面 ...