在贏得了友誼賽後, mx獲得了無敵變身的技能,他帶著技能在寒假去zky做了實習工,並在寒假結束之後獲得了一大筆財富,mx為了不讓這筆錢充公,決定將這筆私房錢藏起來,連mm也不告訴藏在哪,為此mm很是苦惱(有錢不讓我花)。有一天mm在工作室偶然發現了乙個小箱子,箱子上除了有乙個3*3的密碼鎖外還寫著「mx的私房錢」(mdzz)。密碼鎖有以下四種操作:
1.使同一列中三個數同時向下移動一格,並使最下面的數字轉動到同列第一行
2.使同一列中三個數同時向上移動一格,並使最上面的數字轉動到同列最後一行
3.使同一行中三個數同時向右移動一格,並使最右面的數字轉動到同行第一列
4.使同一行中三個數同時向左移動一格,並使最左面的數字轉動到同行最後一列
由於密碼鎖潮濕生鏽,每對密碼鎖進行一次操作需要1 min的時間,現在mx快回工作室了,mm需要將密碼鎖移動成初始狀態來開啟密碼鎖,但卻不知道是否能趕在mx回來之前,聰明的你可以幫助mm計算最短開鎖時間嗎? (當開鎖時間大於5時,則不能趕在mx回來之前開啟,就認為密碼鎖無解)
如圖初始狀態為 294753618
目標解鎖狀態為123456789
輸入第一行乙個數字t,表示t組輸入資料 t<=10
接下來t行,每行包含九個數字,中間無空格隔開,表示密碼鎖的開始狀態
輸出每組資料輸出一行,乙個數字,表示開啟密碼鎖的最短時間,密碼鎖無解輸出「impossible」
(當開鎖時間大於5時,則不能趕在mx回來之前開啟,就認為密碼鎖無解)
樣例輸入
3123456789531496827846953172樣例輸出
03impossible
思路:每一層每一列都有兩種方向,把這12種方向都列出來,判斷步數,超過5步的就不入佇列,因為最多搜5層,所以沒有標記已經搜過的情況。12種改變的是下標,
例如1 2 3 4 5 6 7 8 9 第一行向左移動,得出的是2 3 1 4 5 6 7 8 9 ,1的下標是—+2,2 ,3 的下標都是-1,所以,next陣列代表的是的是這個位置的數的下標的改變值。
#include#include#include#includeusing namespace std;
struct noded,d;
queueq;
int main();
int next[12][10]=,,,
,,,,
,,,,
};scanf("%d",&t);
while(t--)
}if(!f)
for(k=0;k<12;k++)}}
if(ans==0)
printf("impossible\n");
}}
特殊密碼鎖深搜dfs
按鈕有兩種情況 按和不按 按的話就將計數器加一 這個題很經典 還涉及到了深搜裡剪枝 即把那些剛開始遞迴就發現錯誤的 直接返回 在紙上畫畫會發現當遞迴到第k層的時候 第k 2層的資料是永遠不會在這個枝上發生變化的 一定要好搞懂第56行 為啥好要改回來 因為啊 不是有兩種情況麼 就先當作這個鍵按下去 那...
電子密碼鎖
最近剛寫乙個電子密碼鎖的程式,使用verilog語言實現的。剛剛學這個語言,練習一下。感覺這個語言不是很難,而且通過學這個語言,感覺自己還能通過自學掌握一門語言,挺有成就感的。雖然現在只懂verilog最基本的一些語法,但是通過不斷練習我會不加深入的掌握它,也有信心自學更多的。加油!密碼輸入 刪除模...
實用密碼鎖
unsigned char num,i,j unsigned char passwordtemp 16 最大輸入16個 unsigned char inputtimes 密碼輸入錯誤次數 unsigned char passwordlength,plen 輸入密碼長度,實際密碼長度 bit flag...