問題描述:在九宮格中放置8個數,有乙個為空格。給定初始狀態九宮格,和目標狀態九宮格,問需要多少步可以將初始狀態變成目標狀態。如果無法達到輸出-1,如果可以達到,輸出最少的步驟數。
問題分析:本題屬於搜尋演算法中的經典題目。可以用很多方法來解答,一般有a*演算法和廣度搜尋bfs。因為廣度搜尋較容易理解,所以這裡就用bfs來解答。
已知乙個初始狀態,如何利用bfs,搜尋到最終狀態?
如下圖所示,每一次畫出當前可移動之後的狀態,每次移動乙個方塊,層數表示移動的步驟數,一旦搜尋到目標狀態,就停止搜尋返回層數,即最少的步驟數。
這裡有幾個問題需要注意:
1.如何進行重複性判斷? 一旦搜尋到重複的狀態圖,表示前面已經搜尋到過了,所以重複的就不需要考慮了。我是通過set集合,將每個圖對映成乙個整數,將其壓入set集合中,當下次來乙個新的整數,只要判斷它是否在set集合中即可。
2.如何儲存圖的狀態?用乙個結構體node,裡面儲存乙個char[3][3]陣列和空格的位置。
3.如何表示空格周圍方塊的移動?其實只要更新空格的位置,再將空格位置上的原值移動到原來空格的位置即可。簡而言之,就是交換兩個數值的位置,只不過這裡有乙個值是'.'
4.另外注意,移動之後數碼塊的合法性檢查,即是否超出了邊界。
**展示:
#include
#include
#include
#include
using namespace std;
#define n 10005;
char mp[3][3],gp[3][3];
int dir[4][2] = ; //表示上下左右四個方向
struct node
};set st;
queue q;
bool check(node cur)
}return true;
}int cal(node cur)
}return result;
}void bfs()
}cout<>str1>>str2;
int bx=0,by=0;
while(!q.empty())
q.pop();
int len = 0;
for(int i=0;i<3;i++)}}
node cur = node(bx,by,0);
memcpy(cur.cur_mp,mp,sizeof(mp));
q.push(cur);
len = 0;
for(int i=0;i<3;i++)
}bfs();
return 0;
}
BFS解決九宮重排問題
問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...
BFS解決九宮重排問題
問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...
BFS解決九宮重排問題
問題 1426 藍橋杯 歷屆試題 九宮重排 時間限制 1sec 記憶體限制 128mb 提交 215 解決 47 題目描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局...