八数码问题I-bfs和map标记
生活随笔
收集整理的這篇文章主要介紹了
八数码问题I-bfs和map标记
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解題思路:
bfs,將棋盤轉(zhuǎn)化成一個(gè)整數(shù)表示其狀態(tài),比如我們到到達(dá)的狀態(tài)是815736402,而樣例給的輸入狀態(tài)是264137058,因?yàn)檫@些整數(shù)過(guò)大,標(biāo)記數(shù)組開(kāi)不下,所以可以用map來(lái)代替數(shù)組,寫得時(shí)候注意些細(xì)節(jié)。
思路鏈接:
https://blog.csdn.net/qq_41636123/article/details/83010868
代碼如下:
#include <iostream> #include <queue> #include <map>using namespace std;const int N = 4; int mp[N][N]; map<int,int>vis; map<int,int>step; int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};//上 右 下 左 int r,c;//row,col bool move_can(int u,int d)//判斷空格能不能走 {for (int i = 2;i>=0;i--)for (int j = 2;j>=0;j--){mp[i][j] = u%10;u = u/10;if (mp[i][j]==0){r = i;c = j;//記錄空格的位置}}if ((d==0 && r==0) || (d==1 && c==2) || (d==2 && r==2) || (d==3 && c==0) )return false;//我們控制空格移動(dòng),如果空格越界就return falsereturn true; }int move_to(int u,int d)//進(jìn)行空格交換,然后標(biāo)記 {int xx = r +dx[d];int yy = c+dy[d];mp[r][c] = mp[xx][yy];mp[xx][yy] = 0;int tmp =0 ;for (int i = 0;i<3;i++)for (int j = 0;j<3;j++){tmp = tmp*10+mp[i][j];}return tmp; }int bfs(int u) {queue<int>q;vis[u] = 1;step[u] = 0;q.push(u);while(q.size()){int next = q.front();q.pop();if (next==123456780) return step[next];for (int i = 0;i<4;i++){if (move_can(next,i)){int v = move_to(next,i);if (!vis[v]){vis[v] = 1;step[v] = step[next]+1;q.push(v);}}}}return -1; }int main() {int state = 0;for (int i = 0;i<3;i++)for (int j = 0;j<3;j++){cin>>mp[i][j];state = state*10+mp[i][j];//將輸入的數(shù)轉(zhuǎn)換以后標(biāo)記}cout<<bfs(state)<<endl;return 0; }讓我們看看如果換一種輸入方式,要怎么寫呢?
總結(jié)
以上是生活随笔為你收集整理的八数码问题I-bfs和map标记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Keychron 推出 M3 mini
- 下一篇: 根据后序和中序求二叉树的先序