題目:
描述:
在九宮格裡放在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...