[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();
    }
}

  

时间: 2024-10-10 21:59:46

[HDU1195]Open the Lock的相关文章

HDU1195 ZOJ2416 Open the Lock

问题链接:HDU1195 ZOJ2416 Open the Lock. 题意简述:输入测试用例数t,每个例子包括两个4个数字的整数(由1到9组成),一个为源,另外一个为目标.每次可以将其中任何一个数字+1或者-1运算,并且规定1-1=9,9+1=1:也可以将相邻2位数进行交换.问最少需要变换几次,才能从源变为目标. 问题分析:该问题可以用BFS来解决.在BFS搜索过程中,出现过的4位数就不必再试探了,因为再用这个4位数变下去其次数不可能比上次开始的变换次数少.数组notvist[]用于避免重复搜

ACM-BFS之Open the Lock——hdu1195

Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3825    Accepted Submission(s): 1650 Problem Description Now an emergent task for you is to open a password lock. The password is c

Java并发(2):Lock

在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述.本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最后

C# 多线程 lock 实例

class Program { static void Main(string[] args) { //在t1线程中调用LockMe,并将deadlock设为true(将出现死锁) int i = 10; while (i > 0) {  Thread t1 = new Thread(LockMe); t1.Start(true); Thread.Sleep(1000);  Console.WriteLine(string.Format("1.i:{0},开始调用LockMe :{1}&q

mysql启动报错:Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

mysql在首次启动的时候可能会报错:Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist 这时候可以执行脚本 mysql_install_db –user=mysql –ldata=数据存放的路径

MySQL5.6.12 Waiting for commit lock导致从库hang住的问题剖析

nagios报警,线上一台从库检测不到slave状态,于是远程上去查看问题: 1,show slave status\G卡住: Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show slave status\G show slave status卡住了,动弹不了,这种情况还是第一次遇到. 2,看w负载无压力: [root@tmp3_72 ~]# w 13:23:31 u

Ubuntu15、Ubuntu14交换Ctrl和Caps Lock键

在Ubuntu12.04中,交换Ctrl和Caps Lock键非常简单,直接图形就可以设置,但是到了Ubuntu14之后居然没有了,只能去使用命令来设置了. setxkbmap -option ctrl:swapcaps 在终端输入如上命令就可以实现了,但是这样重启后就没有效果了. 在/etc/rc.local最后增加上这句话,重启后没有生效: 在/etc/profile最后中增加上这句话,重启后没有生效: 在/etc/bash.bashrc最后中增加这句话,重启后生效.

mysql Lock wait timeout exceeded

MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded java.lang.Exception:### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction### The error may involve defaultParameterMap### The error occurred wh

Java多线程之~~~Lock接口和ReentrantLock的使用

在多线程开发中,除了synchronized这个关键字外,我们还能通过Lock接口来实现这种效果.通过Lock接口来实现 这种多线程加锁效果的好处是非常的灵活,我们不在需要对整个函数加锁,而且可以很方便的把他放在我们函数的任何 一个地方,非常的称心,而且从效率上来说,使用Lock接口要比使用synchronized关键字效率高一些,下面我们来使用 一个例子来说明这种方法的使用. package com.bird.concursey.charpet3; public class Job imple