簡直難到沒朋友。
雙向bfs + 剪枝。
剪枝策略:
對於2--5位置上的數,僅僅有當游標在相應位置時通過swap ,up。down來改變。那麼當當前位置沒有達到目標狀態時,left和right無意義。
好了。僅僅剪掉這裡就過掉了。。。
還有比較炫酷的方法實現列舉720種排列。
然後狀壓什麼的。。。
功力不夠全然看不懂。
#include #include #include #include #include #include #include #include #include #pragma comment(linker, "/stack:1024000000");
#define eps (1e-8)
#define ll long long
#define ull unsigned long long
#define _ll __int64
#define _inf 0x3f3f3f3f
#define mod 9999991
using namespace std;
short int mark[1000000][7][2];
struct q
;int s[10];
int pre = ;
// 0 1 2 3 4 5 6
inline int cal(int num,int site,int ch)
inline int swap(int num,int site,int m)
bool judge(int site,int a,int b)
int bfs(int a,int b)
while(q.empty() == false)
s.fl = t.fl;
s.ans = t.ans+1;
//left
s.sta = t.sta;
if(t.site > 1 && (t.site < 2 || t.site > 5 || judge(t.site,t.sta,t.fl == 0 ?
b : a))) } //right if(t.site < 6 && (t.site < 2 || t.site > 5 || judge(t.site,t.sta,t.fl == 0 ? b : a))) } //up s.sta = cal(t.sta,t.site,1); s.site = t.site; if(mark[s.sta][s.site][s.fl] == -1) //down s.sta = cal(t.sta,t.site,-1); if(mark[s.sta][s.site][s.fl] == -1) //swap0 if(t.site != 1) } //swap1 if(t.site != 6) } } return 0; } int main() poj1184 聰明的打字員 bfs
本題的重點在於剪枝。對於2,3,4,5號位置上的數字,只有當游標位於該位置上時才可以改變量字。所以當該位置上的數字和目標狀態對應位置上的數字不同時,一定不會執行left或right。狀態的表示用乙個string,最後加上一位表示游標的位置。include include include includ...
聰明的打字員
題目描述 阿蘭是某機密部門的打字員,她現在接到乙個任務 需要在一天之內輸入幾百個長度固定為6的密碼。當然,她希望輸入的過程中敲擊鍵盤的總次數越少越好。不幸的是,出於保密的需要,該部門用於輸入密碼的鍵盤是特殊設計的,鍵盤上沒有數字鍵,而只有以下六個鍵 swap0,swap1,up,down,left,...
聰明的打字員
正解太妙了 將6 66位上的數字壓縮成乙個int intin t,然後雙向 bfs bfsbf s 爆搜即可,卡卡常數勉強過去 由於 十分簡單,所以就不 想 打注釋了 include include include include include include using namespace st...