POJ 1184 聰明的打字員

2021-09-07 04:32:59 字數 1425 閱讀 1100

簡直難到沒朋友。

雙向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...