トピックポータル
問題解決のアイデア:
直接ブール配列スペースを開いた場合、この問題が最も困難なことは、状態を保存する方法ですが、訪問されたBFSは確か揚げになりますので、我々は直接保存するマップと、STL大法が良いですが、保存された別のデータ構造を使用しますAC。
ACコード:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <地図> 4の#include <キュー> 5 6 使用して 名前空間STDを、 7 8 INT [ 3 ] [ 3 ]、N。 9 INT ANS = 123804765 。 10 のconst int型 DX [] = { - 1、0、0、1 }、DY [] = { 0、 - 1、1、0 }。 11マップ< int型、int型 > メートル。 12 13インラインボイドBFS(){ 14 キュー< 長い 長い > Q。 15 q.push(N) 16 M [N] = 0 ; 17 ながら(!q.empty()){ 18 INT U = q.front()。 19 q.pop()。 20 INT X = 0、Yは、= 0、N = U。 21 もし(U == ANS)破ります。 22 のために(INT I = 2; I> = 0。i-- ) 23 のための(INT J = 2、J> = 0 ; j-- ){ 24 [I] [J] = N%10 。 25 N / = 10 。 26 であれば、X = iは、Yは=([I] [j]を!)jは、 27 } 28 のための(int型 i = 0 ; iは< 4 ; iは++ ){ 29 、INT NX = X + DX [i]は、NY = Y + 1 DY [i]は、NS = 0 。 30 であれば(NX < 0|| NY < 0 || NX> 2 || NY> 2)続けます。 31 スワップ([NX] [NY]、[X] [Y])。 32 のために(int型 I = 0 ; iが= < 2 ; I ++ ) 33 のための(INT J = 0 ; J <= 2、J ++ ) 34 ナノ秒=のNS * 10 + [I] [J]。 35 であれば(!m.count(NS)){ 36 M [NS] = M [U] + 1 。 37 q.push(NS)。 38 } 39 スワップ([NX] [NY]、[X] [Y])。 40 } 41 } 42 } 43 44 のint main()の 45 { 46 のscanf(" %d個"、&N) 47の BFS()。 48 のprintf(" %dの"、M [ 123804765 ])。 49 リターン 0 ; 50 }