総乗客ニンニクロック(BFS)

 

 

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

 

説明

今、急務は、ロックを開くことです。4桁のパスワードは、各桁は1-9から番号が付けられています。それぞれが任意の数の1だけ増分または減分することができます。場合9プラス1数が9を変更した場合、符号1は、1マイナス1となります。あなたはまた、彼らの隣人と番号を交換することができ、すべてのアクションは、ステップによって示さ。今、あなたのタスクは、ロックを開くために、最小の手順を使用することです。
注:左端の桁は右端の桁の隣人ではありません。

入力

最初の4桁の入力行、ロックの初期状態という。

第二のライン入力の4桁はロック解除パスワードを表します。

出力

整数出力は、最小のステップを表します。

サンプル入力

1234 
2144

サンプル出力

2 

 

この質問は、検索で予期しない操作を行うために始めています。

しかし、このトピックは、完了するために、BFSを使用することは非常に簡単で、まだです。

 

私たちの方法については、この疑問符、通常のマーカーは同じではありません、我々は我々の状態フラグに達していました。

パスワードはABCDである場合、対応するフラグと呼ばれるべきである:我々は4桁のグループパスワードと呼ばれるマークの4次元配列、を介して行われて達成することができる状態即ちvis[a][b][c][d]=1。

たびに、私たちは、次の3つの操作、最初の一から一を加えた4桁の1、マイナス1、第三の交換のために4桁の数字で、第2のビットのために4桁の数字を持っています。

 

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <iostreamの>
 4の#include < ストリング >
 5の#include <math.h>の
 6の#include <アルゴリズム>
 7の#include <ベクトル>
 8#含む<スタック>
 9の#include <キュー>
 10の#include < セット >
 11の#include <地図>
 12の#include <sstream提供さ>
 13  のconst  int型 INF = 0x3f3f3f3f 14 typedefの長い 長いLL。
 使用して 名前空間はstdを、
16  
17  構造体ノード
 18  {
 19      のint NUM [ 4 ]。
20      INT ステップと
21  }、最初の最後。
22  INT VIS [ 11 ] [ 11 ] [ 11 ] [ 11 ]。
23の 
24  ボイドBFS()
 25  {
 26      キュー<ノード> QE。
27      ノードT。
28      T = 最初;
29      qe.push(T)。
30      VIS [t.num [ 0] [t.num [ 1 ] [t.num [ 2 ]] [t.num [ 3 ] = 1 31      ながら(!qe.empty())
 32      {
 33          T = qe.front()。
34          qe.pop()。
35          であれば(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 \ n " 、t.step);
 38              リターン;
 39          }
 40          のためにINTは iは= 0 ; I < 4 ; I ++)// +1 
41          {
 42              ノード次= T;
 43              next.num [I] + + ;
 44              もし(next.num [I] == 10)next.num [I] = 1 ;
 45              であれば!(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(次の);
50              }
 51          }
 52          のためにINTは iは= 0 ; I < 4 ; I ++)// -1 
53          {
 54              ノード次= T。
55              next.num [I] - 56              もし(next.num [I] == 0)next.num [I] = 9 57              であれば(!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(次)
62              }
 63          }
 64          のためにINTiは= 0 ; I < 3 ; I ++)// 交换
65          {
 66              ノード次= T。
67              スワップ(next.num [I]、next.num [I + 1 ])。
68              であれば(!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(次)
73              }
 74          }    
 75      }
 76  }
 77  
78  のint main()の
 79  {
 80      の#ifdefデバッグ
 81      freopenは(" SAMPLE.TXT "" R " 、STDIN)。
82      #endifの
83      
84      チャー 0009 [ 5 ]。
85      チャー STR2 [ 5 ]。
86      のscanf(" %S%S " 、STR1、STR2)。
87      のためにINT iは= 0 ; iは< 4 ; I ++ 88      {
 89          first.num [I] = 0009 [I] - ' 0 ' 90          last.num [I] = STR2 [I] - ' 0 ' 91      }
 92      BFS()。
93      
94      リターン 0 ;
95 }

 

 

 

 

-

おすすめ

転載: www.cnblogs.com/jiamian/p/12181691.html