題目:八數碼難題
思路:bfs+hash判重。
注意:1、hash的鍊錶不能寫錯。
2、由於用的是一位陣列,所以移動時要判斷左右邊界。比如當前的空位在5處,就不能向右移+1。
0 1 2
3 4 5
6 7 8
**:
#include#include#include #include #include #include #include #include #include #include #include using namespace std;
#define n 8
#define max_state 362880
#define mod 1000003
int head[mod+5],nxt[mod+5],val[mod+5],num=0;
struct state
} bool find()
return false;
} void add()
bool judge()
};bool agree(int x,int mv)
const int m[5]= ;
state que[max_state+5];
int bfs(state in)
if(x.judge()) return x.step;
}} }
return -1;
}int main()
} x.step=0;
printf("%d",bfs(x));
return 0;
}
洛谷 1379 八數碼難題
在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...
洛谷 P1379 八數碼難題
在3 3 的棋盤上,擺有八個棋子,每個棋子上標有 1 至 8的某一數字。棋盤中留有乙個空格,空格用 0 來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為 123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局...
洛谷 P1379 八數碼難題
在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...