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 }
-