• hdu 1195 Open the Lock


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

    题目大意:密码解锁,有两种方式:第一,拨动密码;第一,调换相邻密码的位置。以这两种方式找到最少次数的解锁次数!

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 using namespace std;
     6 char ch[10],str[10];
     7 int dir[2]= {1,-1},flag,vis[15][15][15][15];
     8 
     9 struct node
    10 {
    11     int x[5];
    12     int time;
    13 } ;
    14 
    15 void bfs()
    16 {
    17     queue<node>q;
    18     node s;
    19     for (int i=0; i<4; i++)
    20         s.x[i]=ch[i]-'0';
    21     s.time=0;
    22     q.push(s);
    23     vis[s.x[0]][s.x[1]][s.x[2]][s.x[3]]=1;
    24     while (!q.empty())
    25     {
    26         //cout<<s.x[0]<<s.x[1]<<s.x[2]<<s.x[3]<<" ";
    27         //cout<<s.time<<" ";
    28         s=q.front();
    29         q.pop();
    30         int temp=0;
    31         for (int i=0; i<4; i++)
    32             if (s.x[i]==str[i]-'0')
    33                 temp+=1;
    34         if (temp==4)
    35         {
    36             flag=s.time;
    37             return ;
    38         }
    39         else
    40         {
    41 
    42             for(int i=0; i<4; i++)
    43             {
    44                 for(int j=0; j<2; j++)
    45                 {
    46                     node ss=s;
    47                     ss.x[i]+=dir[j];
    48                     if (ss.x[i]==10)
    49                         ss.x[i]=1;
    50                     else if (ss.x[i]==0)
    51                         ss.x[i]=9;
    52                     if(!vis[ss.x[0]][ss.x[1]][ss.x[2]][ss.x[3]])
    53                     {
    54                         ss.time++;
    55                         vis[ss.x[0]][ss.x[1]][ss.x[2]][ss.x[3]]=1;
    56                         q.push(ss);//cout<<s.time<<endl;
    57                     }
    58                 }
    59             }
    60             for(int i=0; i<3; i++)
    61             {
    62                 node ss=s;
    63                 int ans=ss.x[i];
    64                 ss.x[i]=ss.x[i+1];
    65                 ss.x[i+1]=ans;
    66                 if(!vis[ss.x[0]][ss.x[1]][ss.x[2]][ss.x[3]])
    67                 {
    68                     ss.time++;
    69                     vis[ss.x[0]][ss.x[1]][ss.x[2]][ss.x[3]]=1;
    70                     q.push(ss);
    71                 }
    72             }
    73 
    74         }
    75 
    76     }
    77 }
    78 int main ()
    79 {
    80     int t;
    81     while (cin>>t)
    82     {
    83         while (t--)
    84         {
    85             flag=-1;
    86             memset(vis,0,sizeof(vis));
    87             getchar();
    88             for (int i=0; i<4; i++)
    89                 scanf("%c",&ch[i]);
    90             getchar();
    91             for (int j=0; j<4; j++)
    92                 scanf ("%c",&str[j]);
    93             bfs();
    94             if (flag>-1)
    95                 printf ("%d
    ",flag);
    96             getchar();
    97         }
    98     }
    99 }
  • 相关阅读:
    Windows系统CMD窗口下,MySQL建库、还原数据库命令操作示例
    Java JPA 报java.lang.IllegalArgumentException: Validation failed for query for method public abstract ...异常的一种原因和解决办法
    MySQL 5.7 执行SQL报错:1055
    Java8使用实现Runnable接口方式创建新线程的方法
    模板方法模式
    策略模式
    观察者模式
    装饰器模式
    原型模式
    单例模式
  • 原文地址:https://www.cnblogs.com/qq-star/p/3880267.html
Copyright © 2020-2023  润新知