八數碼問題(廣搜)

2021-08-29 01:55:52 字數 1243 閱讀 9477

題目:

描述:

在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態(用0表示空格):

1 2 3

4 5 6

7 8 0

輸入:

輸入乙個給定的狀態。

輸出:

輸出到達目標狀態的最小步數。不能到達時輸出-1。

輸入樣例:

1 2 3

4 0 6

7 5 8

輸出樣例:

思想:廣搜,將每一次擴充套件後的節點的狀態用乙個9位十進位制數來表示,目標狀態是123456780,判重用set,之後就是全裸的廣搜;

#include #include #include #include #include #include using namespace std;

const int maxn = 400000;

const int status = 123456780;

int vis[maxn];

int dir[4] = ;

char tmp[20];

struct state

;int new_status(int statuss,int n)

switch (n)

break;

case 3://第3行

if(zero_loc + 3 > 8)

return -1;

else

break;

case -1: //第一列

if(zero_loc % 3 == 0)

return -1;

else

break;

case 1: //第三列

if(zero_loc % 3 == 2)

return -1;

else

break;

}return atoi(tmp);

}int bfs(state st)

for(int i = 0;i < 4;i ++)

}return -1;

}int main()

state st;

int step = bfs(st);

cout << step << endl;

//cout << tmp << endl;

return 0;

}/*被我們qiwang老師聰明的才智所折服*/

八數碼 廣搜)

時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...

c 八數碼問題(廣搜)

時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...

雙向廣搜 八數碼

雙向廣搜還是乙個很神奇的東西 判重更神奇 雙廣僅適用於有目標狀態的題目 include include include include include include include include include include using namespace std const int maxx...