在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局(為了使題目簡單,設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。
輸入格式:
輸入初始狀態,一行九個數字,空格用0表示
輸出格式:
只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)
輸入樣例#1:
283104765
輸出樣例#1:
4
普通搜尋7000ms
#include #include#include
#include
using
namespace
std;
#define reg register
#define ll long longll st, ed;
mapint>vis;
struct
date ;
const
int dx = , dy = ;
intmain()
);
while(!q.empty())
int a[4][4
];
int tmp =hsh;
for (reg int i = 3 ; i >= 1 ; i --)
for (reg int j = 3 ; j >= 1 ; j --)
a[i][j] = tmp % 10, tmp /= 10
;
int x = 0, y = 0
;
for (reg int i = 1 ; i <= 3 ; i ++)
for (reg int j = 1 ; j <= 3 ; j ++)
if (!a[i][j])
for (reg int i = 1 ; i <= 4 ; i ++)
);swap(a[x][y], a[tx][ty]);}}
return0;
}
雙向廣搜242ms
#include #include#include
#include
using
namespace
std;
#define reg register
#define ll long longll st, ed;
mapint>vis1, vis2;
struct
date ;
const
int dx = , dy = ;
intmain()
); q2.push((date));
vis1[st] = 0, vis2[ed] = 0
;
if (st == ed) return puts("
0"), 0
;
while(!q1.empty() and !q2.empty())
int a[4][4
];
int tmp =hsh;
for (reg int i = 3 ; i >= 1 ; i --)
for (reg int j = 3 ; j >= 1 ; j --)
a[i][j] = tmp % 10, tmp /= 10
;
int x = 0, y = 0
;
for (reg int i = 1 ; i <= 3 ; i ++)
for (reg int j = 1 ; j <= 3 ; j ++)
if (!a[i][j])
for (reg int i = 1 ; i <= 4 ; i ++)
);swap(a[x][y], a[tx][ty]);
}hsh =q2.front().hsh;
tp =q2.front().stp;
q2.pop();
if(vis1[hsh])
tmp =hsh;
for (reg int i = 3 ; i >= 1 ; i --)
for (reg int j = 3 ; j >= 1 ; j --)
a[i][j] = tmp % 10, tmp /= 10
; x = 0, y = 0
;
for (reg int i = 1 ; i <= 3 ; i ++)
for (reg int j = 1 ; j <= 3 ; j ++)
if (!a[i][j])
for (reg int i = 1 ; i <= 4 ; i ++)
);swap(a[x][y], a[tx][ty]);
}
}return0;
}
八數碼難題(luogu 1379)
在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...
Luogu 1379 八數碼難題
吐槽 此題就是一點一點卡過去的 警告 1 千萬不能用dfs搜這種東西 dfs需要遍歷所有狀態才能找到最優解 分分鐘 2 寫結構體的時候要綜合判斷 的加和不加 code luogu judger enable o2 include include include using namespace std...
C P1379 八數碼難題
題目 p1379 八數碼難題 經典演算法教材題目,然後我決定用 hash bfs 搞一下,解釋 附上 include include using namespace std string strat,end 123804765 que 1000000 strat輸入和取佇列頭,end終點,que佇列...