羅区P1379 8つのデジタル問題(マップ)

トピックポータル

問題解決のアイデア:

直接ブール配列スペースを開いた場合、この問題が最も困難なことは、状態を保存する方法ですが、訪問された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 [] = { - 1001 }、DY [] = { 0、 - 110 }。
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> = 0i-- 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 }

 

おすすめ

転載: www.cnblogs.com/lipeiyi520/p/11348764.html