【搜索】九宮重排

1581: 題目名稱:九宮重排

題目描述

問題描述
以下面第一個圖的九宮格中,放着 1~8 的數字卡片,還有一個格子空着。與空格子相鄰的格子中的卡片能夠移動到空格中。通過若干次移動,能夠造成第二個圖所示的局面。
咱們把第一個圖的局面記爲:12345678.
把第二個圖的局面記爲:123.46758
顯然是按從上到下,從左到右的順序記錄數字,空格記爲句點。
本題目的任務是已知九宮的初態和終態,求最少通過多少步的移動能夠到達。若是不管多少步都沒法到達,則輸出-1。
 

輸入

輸入格式
輸入第一行包含九宮的初態,第二行包含九宮的終態。
 

輸出

輸出格式
輸出最少的步數,若是不存在方案,則輸出-1。
 

 

樣例輸入

12345678.
123.46758

樣例輸出

3

利用字符串進行標記,考察了,一位數組轉二維,還有BFS搜索。
對行號進行整除,對列號進行取餘。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef struct Node{
 4     string S;
 5     int step;
 6 }Node;
 7 int dir[4][2]={
 8         {-1,0},
 9     {0,-1},{0,1},
10         {1,0}
11 };
12 map< string , int >Mp;
13 string s,e,tmp;
14 int main()
15 {
16     ios_base :: sync_with_stdio(0);
17     cin.tie(NULL),cout.tie(NULL);
18     
19     cin>>s>>e;
20     queue<Node> Q;
21     Q.push(Node{s,0});
22     int x , y , ans = -1 ;
23     Mp[s] = 1;
24     while( !Q.empty() ){
25         Node cur = Q.front() ,Next ;
26         Q.pop();
27         s = cur.S;
28         if( s == e ){
29             ans = cur.step;
30             break;
31         }
32         for(int i=0;i<9;i++){
33             if( s[i] == '.' ){
34                 x = i/3 ;
35                 y = i%3 ;
36                 //cout<<s<<endl;
37                 //cout<<x<<" "<<y<<endl;
38                 break;
39             }
40         }
41         for(int i=0;i<4;i++){
42             int tx = x + dir[i][0];
43             int ty = y + dir[i][1];
44             if( 0<=tx && tx<=2 && 0<=ty && ty<=2 ){
45                 //cout << "Tx :" << tx << " " << ty <<endl;
46                 tmp = s;
47                 swap( tmp[x*3+y] , tmp[tx*3+ty] );
48                 //cout<<tmp<<endl;
49                 if( !Mp[tmp] ){
50                     Mp[tmp] = 1 ;
51                     Next.S = tmp;
52                     Next.step = cur.step+1;
53                     Q.push(Next);
54                 }
55             }
56         }
57     }
58     printf("%d\n",ans);
59     return 0;
60 }
61 /*
62 
63 12345678.
64 123.46758
65 
66 3
67 
68 */
View Code
相關文章
相關標籤/搜索