hdu1195Open the Lock

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195

搜索就三种规则, 一个是+1 一个是-1 还有一个是交换,用bfs搜索就行了,参照大神的思路。。。

代码:

#include <cstdio>
#include <queue>
#include <cstring>

using namespace std;

int a[5];
int b[5];
struct Node
{
    int di[5];
    int st;
};
int v[10][10][10][10];

void bfs()

{
    queue<Node> q;
    Node f;
    for(int i = 0; i < 4; ++i)
        f.di[i] = a[i];
    f.st = 0;
    q.push(f);
    while(!q.empty())
    {
        Node t = q.front();
        q.pop();

        int flag = 1;
        for(int i = 0; i < 4; ++i)
        {
            if(t.di[i] != b[i])
            {
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            printf("%d\n",t.st);
            return ;
        }
        Node p ;
        for(int i = 0; i < 4; ++i) // +1
        {
            p = t;
            if(p.di[i] == 9)
                p.di[i] = 1;
            else p.di[i]++;
            p.st = t.st + 1;
            if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
            {
                v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
                q.push(p);
            }
        }
        for(int i = 0; i < 4; ++i)  // -1
        {
            p = t;
            if(p.di[i] == 1)
                p.di[i] = 9;
            else
                p.di[i]--;
            p.st = t.st + 1;
            if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
            {
                v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
                q.push(p);
            }
        }
        for(int i = 0; i < 3; ++i) //交换
        {
            p = t;
            p.di[i] = t.di[i + 1];
            p.di[i + 1] = t.di[i];
            p.st = t.st + 1;
            if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
            {
                v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
                q.push(p);
            }
        }
    }
}
int main()

{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        memset(v,0,sizeof(v));
        char s[10],s1[10];
        scanf("%s",s);
        for(int i = 0;i < 4;++i)
            a[i] = s[i] - '0';
        scanf("%s",s1);
        for(int i = 0; i < 4; ++i)
            b[i] = s1[i] - '0';
        bfs();
    }
}
时间: 2024-11-04 02:14:32

hdu1195Open the Lock的相关文章

HDU1195Open the Lock( BFS )

题意:开锁,给出了密码的初始状态,和目标状态,这里密码是固定的四位,每次可以把某一位加一或者减一,再者交换相邻的两位,最左边与最右边是不相邻的 解法:BFS,实现操作的函数即可 #include<iostream> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<queue>

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

Cannot lock storage /tmp/hadoop-root/dfs/name. The directory is already locked.

[[email protected] bin]# ./hadoop namenode -format 12/05/21 06:13:51 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG:   host = nn01/127.0.0.1 STARTUP_MSG: