我們可以將這個問題抽象成乙個圖。設原始狀態為起點,結尾狀態為終點,變化的狀態為中間點,每次都可以將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範圍內 表示完整陣列。接下...