• 计蒜客 密码锁(BFS)


    https://www.jisuanke.com/course/1797/121114

    Description

    现在一个紧急的任务是打开一个密码锁。密码由四位数字组成,每个数字从 1 到 9 进行编号。每次可以对任何数字加 1 或减 1。当将9加 1 时,数字将变为1,当1减 1 的时,数字将变为9。您也可以与邻居交换数字,每一个行动记做一步。现在你的任务是使用最小的步骤来打开锁。
    注意:最左边的数字不是最右边数字的邻居。

    Input

    第一行输入四位数字,表示密码锁的初始状态。

    第二行输入四位数字,表示开锁的密码。

    Output

    输出一个整数,表示最小步骤。

    样例输入

    1234
    2144

    样例输出

    2 

    这道题最开始想不到用搜索来做。

    不过这种题目还是很容易使用bfs来完成。

    对于这道题目我们采用的标记方法和平时的标记也不太一样,我们是标记我们到达过的状态。

    我们可以就是通过四维数组来完成标记,把由4个数字组成的一组密码记为一种状态,即:当密码为abcd时,对应的标记就应该记为vis[a][b][c][d]=1。

    每次我们可以的操作有三种,第一种对于四位数字中的某一位加一,第二种对于四位数字中的某一位减一,第三种对于四位数字进行交换。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <vector>
     8 #include <stack>
     9 #include <queue>
    10 #include <set>
    11 #include <map>
    12 #include <sstream>
    13 const int INF=0x3f3f3f3f;
    14 typedef long long LL;
    15 using namespace std;
    16 
    17 struct node
    18 {
    19     int num[4];
    20     int step;
    21 }first,last;
    22 int vis[11][11][11][11];
    23 
    24 void BFS()
    25 {
    26     queue<node> qe;
    27     node t;
    28     t=first;
    29     qe.push(t);
    30     vis[t.num[0]][t.num[1]][t.num[2]][t.num[3]]=1;
    31     while(!qe.empty())
    32     {
    33         t=qe.front();
    34         qe.pop();
    35         if(t.num[0]==last.num[0]&&t.num[1]==last.num[1]&&t.num[2]==last.num[2]&&t.num[3]==last.num[3])
    36         {    //BFS出口 
    37             printf("%d
    ",t.step);
    38             return ;
    39         }
    40         for(int i=0;i<4;i++)//+1 
    41         {
    42             node next=t;
    43             next.num[i]++;
    44             if(next.num[i]==10) next.num[i]=1;
    45             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
    46             {
    47                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
    48                 next.step++;
    49                 qe.push(next);
    50             }
    51         }
    52         for(int i=0;i<4;i++)//-1
    53         {
    54             node next=t;
    55             next.num[i]--;
    56             if(next.num[i]==0) next.num[i]=9;
    57             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
    58             {
    59                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
    60                 next.step++;
    61                 qe.push(next);
    62             }
    63         }
    64         for(int i=0;i<3;i++)//交换 
    65         {
    66             node next=t;
    67             swap(next.num[i],next.num[i+1]);
    68             if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
    69             {
    70                 vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
    71                 next.step++;
    72                 qe.push(next);
    73             }
    74         }    
    75     }
    76 }
    77 
    78 int main()
    79 {
    80     #ifdef DEBUG
    81     freopen("sample.txt","r",stdin);
    82     #endif
    83     
    84     char str1[5];
    85     char str2[5];
    86     scanf("%s %s",str1,str2);
    87     for(int i=0;i<4;i++)
    88     {
    89         first.num[i]=str1[i]-'0';
    90         last.num[i]=str2[i]-'0';
    91     }
    92     BFS();
    93     
    94     return 0;
    95 }

    -

  • 相关阅读:
    软件开发面试
    jQuery插件
    基于消息的软件架构
    线程池的原理及实现(转)
    java实现生产者消费者问题(转)
    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)
    JAVA CAS原理深度分析(转)
    菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)
    Android中利用Handler实现消息的分发机制(三)
    char* 和char[]的差别
  • 原文地址:https://www.cnblogs.com/jiamian/p/12181691.html
Copyright © 2020-2023  润新知