pku1184很有技巧的廣搜

2021-05-26 16:56:29 字數 1122 閱讀 9626

題意:有乙個六位數,開始游標在第一位數上,現在通過向左,右移動游標,將游標上的數加,減一,與第一,五個數交換這幾個操作變為另乙個數(游標在任何地方都滿足),求最少的運算元。

分析:開始想雙向廣搜,狀態為6*10^6個狀態,和單向廣搜是一樣的,會超時。後面想的幾種優化發現根本就不叫優化。最後還是看了discuss。。。orz,還是太水了。。。我們可以把兩個數的六位數的對應關係列舉出來6!=720種情況,即目標的六個位置分別是原始的哪些位置上的數通過加一,減一而來的(因為游標左,右移,與第一,第五位置交換只是把數的位置換來換去)。又因為左,右移,與第一,五個位置交換也算操作,所以我們必須記錄經過多少步可以到達這個對應關係。而轉化的過程中與游標的位置相關,所以要標記現在游標的位置(6種),與游標已經經過的位置(我們把與第五個數交換也看作經過了第五個位置,10種情況)。

//輸入兩個六位數,問至少經過幾次給定的交換使得第乙個數等於第二個數

//先將最終的數的位置對應的原來的位置求出來,後面直接算加還是減多少就行了

#include#includeusing namespace std;

struct point

q[44000];

//最終的每位數肯定都是由前面乙個數的每位數對應變化而來的,所以對應關係最多為6!=720

//第二維表示最終的游標停在哪個位置。第三維表示游標到過的位置,如果與六號位置交換了數字,則我們也算六號位置也經過了

int dp[720][6][10];//dp[i][j][k]表示第i個排列,最終游標在j+1的位置,經過的位置為第k種情況

//經過位置的具體情況

int stage[10]=;//用二進位制表示各位,每位對應的權重為2^(i-1)。。。如39=1+2+4+32表示第1,2,3,6位置經過了,同時也說明有位置與6號位置交換過數字

int a[10]=;

int abs(int n)

int c1(int a)//對應的是第幾個排列

{ int i,j,k,n=0;

bool flag[6];

memset(flag,false,sizeof(flag));

for(i=0;i<5;i++)

{ for(k=0,j=0;j

PKU 密碼翻譯

在情報傳遞過程中,為了防止情報被截獲,往往需要對情報用一定的方式加密,簡單的加密演算法雖然不足以完全避免情報被破譯,但仍然能防止情報被輕易的識別。我們給出一種最簡的的加密方法,對給定的乙個字串,把其中從a y,a y的字母用其後繼字母替代,把z和z用a和a替代,則可得到乙個簡單的加密字串。讀取這一行...

九度1184解題報告

這是乙個二叉樹的問題,題目如下 事實上考的就是二叉樹的資料結構以及先序和中序遍歷。一般來說,僅僅由先序遍歷序列無法得到中序序列,然而,本題特殊的地方在於先序遍歷序列中給出了遍歷中遇到的空指標,這樣就很容易根據序列構造二叉樹 依次訪問先序序列,遇到 就返回空指標,遇到非 字元就構造乙個對應的節點,然後...

1184 漢諾塔(一)

在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只移動一片,不管在哪根針上,小片必...