私の個人的な感情は、その変形BFS、またはBFS難易特定の学位を持って、悪い人のマスターです。
この質問のアイデア:
一般的にBFSを見つけ、より多くのステップの番号の前にキュー状態の特定の状態を達成するためのステップ数が少ないので、一つだけキューウェイトマップ、付属しています。
1の#include <iostreamの> 2の#include <cmath> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <地図> 6の#include <キュー> 7 使って 名前空間STDを、 8 長い 長い DX [ 4 ] = { - 1、0、0、1 }。 9 長い 長 DY [ 4 ] = { 0、 - 1、1、0 }。 10 長い 長N。 11 INT main()の 12 { 13 CIN >> N。 14 キュー< 長い 長い > Q; 15 q.push(N) 16 地図< 長い 長い、長い ロング > M。 17 M [N] = 0 ; 18 ながら(!q.empty()) 19 { 20 int型 CNT = q.front()。 21 INT zyc [ 3 ] [ 3 ]、XX = 0、YY = 0、N = CNT。 22 q.pop()。 23 もし(CNT == 123804765)ブレーク。 24 のための(長い 長い I = 2 ; I> = 0 ; i-- ) 25 のための(長い 長い J = 2、J> = 0 ; j-- ) 26 { 27 zyc [I] [J] = N%10 ; 28 N / = 10 。 29 であれば(!zyc [I] [J]) 30 { 31 XX = I; 32 YY = J。 33 } 34 } 35 のための(長い 長 i = 0 ; iは< 4 ; iは++ ) 36 { 37 長い 長い NX = XX + DX [i]は、NY = YY + DYの[i]は、ANS = 0 。 38 であれば(NX < 0 || NY < 0 ||がnx> 2 || NY> 2)続けます。 39 スワップ(zyc [NX] [NY]、zyc [XX] [YY])。 40 のための(長い 長 i = 0 ; iが< 3 ; iは++ ) 41 のための(長い 長い J = 0 ; J < 3 ; J ++)ANS = ANS * 10 + zyc [I] [J]。 42 であれば(!m.count(ANS)) 43 { 44 M [ANS] = mの[CNT] + 1 。 45 q.push(ANS)。 46 } 47 スワップ(zyc [NX] [NY]、zyc [XX] [YY])。 48 } 49 } 50 COUT << M [123 804 765 ]; 51は、 戻り 0 ; 52である }
ビッグブラザーの論文ください(とにかく、私はそれが論文を何を意味するのか知りません)