最少交換次數

2022-04-30 11:24:09 字數 883 閱讀 3651

bfs,折半搜尋,因為直接搜大概有(12)^13?因為每個狀態都會擴充套件出m種狀態大概是(12)^13,然而可以折半搜尋,只搜一半,狀態數變成(12)^7可以接受,但是事實上極限資料要跑很長很長時間,據說正解是啟發式搜尋?沒學過

#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;string

s,tar;

mapmp;

mapmp1;

queue

q;queue

temp;

intn,m,p;

int a[30],b[30

];ll hash(

string

s)

return

ret;

}bool

bfs()

temp.push(s);mp[s] = step + 1

; }

swap(s[a[i]],s[b[i]]);}}

return

true;}

void

bfs1()

if(!mp1.count(s))

swap(s[a[i]],s[b[i]]);}}

}int

main()

//cout>a[i]>>b[i],a[i]--,b[i]--;

if(s==tar)

if(bfs()) bfs1();

return0;

}

最少交換次數

第乙個問題 現在想通過交換相鄰元素的操作把乙個給定序列交換成有序,最少需要交換的次數是多少?比如3 1 2 4 5需要最少交換2次。答案 需要交換的最少次數為該序列的逆序數。證明 可以先將最大數交換到最後,由於是相鄰兩個數交換,需要交換的次數為最大數後面的數的個數 可以看做是最大數的逆序數 然後,交...

陣列排序 計算最少交換次數

交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...

1151 最少交換次數來組合所有的 1

給出乙個二進位制陣列 data,你需要通過交換位置,將陣列中 任何位置 上的 1 組合到一起,並返回所有可能中所需 最少的交換次數。示例 1 輸入 1,0,1,0,1 輸出 1 解釋 有三種可能的方法可以把所有的 1 組合在一起 1,1,1,0,0 交換 1 次 0,1,1,1,0 交換 2 次 0...