acwing 845 八數碼 (最小步數模型)

2021-10-21 14:41:25 字數 999 閱讀 1553

我們可以將這個問題抽象成乙個圖。設原始狀態為起點,結尾狀態為終點,變化的狀態為中間點,每次都可以將x位置與它相鄰的四個方向交換(4中狀態,符合條件下),這四個方向的狀態就是新的點,而且是這個狀態能到達的點,我們設點之間的距離是1,那麼要求的變換最少次數就是求起始點到終點的最短距離

我們將起始點放入bfs的佇列,每次通過取出隊頭來遍歷四個方向,如果狀態符合,就更新距離,並將新的點放入佇列

小技巧:我們這裡的點其實就是字串,那麼由x轉化的四個狀態,可以先將字串轉化成二維的**,然後變換之後再轉化成新的字串狀態

//將二維座標對映成一維點(下標從0開始)   n是二維陣列邊長(正方形)

intget

(int x,

int y)

//一維座標轉化未二維座標,k表示一維下標,n表示轉化為二維座標的邊長

int x = k / n , y = k % n ;

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1e5+10;

int dx[4]

=;int dy[4]

=;intbfs

(string start)

swap

(t[k]

, t[a *

3+ b]);

}}}return-1

;}intmain()

cout <<

bfs(start)

<< endl;

return0;

}

Acwing 179 八數碼 A 演算法

1.題目 2.解決方法 本題仍然是運用a 演算法求解,將狀態中每個數距離自己合法位置的曼哈頓距離之和作為估價函式,將估價函式與距離起點狀態的實際距離作為估計值,搜尋中的每個狀態都有乙個這樣的估計值,用小根堆使每次搜尋擴充套件結點時保證是估計值最小的狀態 也就是最短路徑上的狀態 3.include i...

AcWing 789 數的範圍

給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 輸入格式 第一行包含整數n和q,表示陣列長度和詢問個數。第二行包含n個整數 均在1 10000範圍內 表示完整陣列。接下來q行,每...

AcWing 789 數的範圍

題目描述 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 輸入格式 第一行包含整數n和q,表示陣列長度和詢問個數。第二行包含n個整數 均在1 10000範圍內 表示完整陣列。接下...