Luogu1379 八數碼難題

2022-02-05 23:08:57 字數 2633 閱讀 9270

在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佇列...