poj 1184 廣搜高階題

2022-07-28 20:51:31 字數 1439 閱讀 4558

起初的想法果然就是乙個6000000的狀態的表示。

但是後面覺得還是太過於幼稚了。

可以看看網上的解釋,其實就是先轉換位置,然後再改變量字的大小。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

std::swap;

8using

std::queue;

9int

const inf = 10000000;10

intconst n = 6;11

struct

node

12cur,nt;

16int vis[n][n][n][n][n][n][n][10

];17 node record[720

];18

int visp[10][n]=19;

31char start[n+1],end1[n+1

];32

intcnt;

33void

system()

3441}42

bool

judge(node tmp)

4346

void

createvis(node tmp)

4750

void

bfs()

5176}77

if(cur.pos<5)78

88 nt=cur;

89if(nt.sta<5

)90 nt.sta+=5

;91 nt.step=cur.step+1

;92 swap(nt.num[5

],nt.num[nt.pos]);

93if(!judge(nt))

9498}99

}100

}101

int min(int a,int

b)102

105int

main()

106120

int step=0,flag,ans=inf;

121for(int i=0;i)

122131

else

132 step+=abs(start[record[i].num[j]]-end1[j]);

133}

134if

(flag)

135 ans=min(ans,step);

136}

137 printf("

%d\n

",ans);

138}

139return0;

140 }

view code

POJ 1184 聰明的打字員

簡直難到沒朋友。雙向bfs 剪枝。剪枝策略 對於2 5位置上的數,僅僅有當游標在相應位置時通過swap up。down來改變。那麼當當前位置沒有達到目標狀態時,left和right無意義。好了。僅僅剪掉這裡就過掉了。還有比較炫酷的方法實現列舉720種排列。然後狀壓什麼的。功力不夠全然看不懂。incl...

poj1184 聰明的打字員 bfs

本題的重點在於剪枝。對於2,3,4,5號位置上的數字,只有當游標位於該位置上時才可以改變量字。所以當該位置上的數字和目標狀態對應位置上的數字不同時,一定不會執行left或right。狀態的表示用乙個string,最後加上一位表示游標的位置。include include include includ...

廣搜水題 Poj 3984

該題主要是學會任何在廣搜的過程中,記錄下最短的那條路徑 方法 佇列中的任何乙個節點的前驅節點唯一,利用這一點,記錄下前驅節點並深搜輸出 include include using namespace std 定義節點 struct node node 5 5 定義佇列 queueq 定義四個方向的想...