起初的想法果然就是乙個6000000的狀態的表示。
但是後面覺得還是太過於幼稚了。
可以看看網上的解釋,其實就是先轉換位置,然後再改變量字的大小。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
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 }
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 定義四個方向的想...