問題描述
有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成(n<30),按鈕有凹/凸兩種狀態,用手按按鈕會改變其狀態。然而讓頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個按鈕。當前密碼鎖狀態已知,需要解決的問題是,你至少需要按多少次按鈕,才能將密碼鎖轉變為所期望的目標狀態。
輸入
兩行,給出兩個由0、1組成的等長字串,表示當前/目標密碼鎖狀態,其中0代表凹,1代表凸。
輸出
至少需要進行的按按鈕操作次數,如果無法實現轉變,則輸出 impossible。
樣例輸入
011
000
樣例輸出
1我の思考
此題想要用列舉法來解決,那我們就應該找出可能的幾種情況。我們研究過這個機制後會發現,影響按鈕改變的其實就是周圍的按鈕。但是在這裡,我們會發現,第乙個按鈕的按與否,會影響到後面所有的按鈕,也就是說,這裡的列舉是列舉出當按下第乙個按鈕和不按第乙個按鈕的情況。而其他的,就只要找到乙個不和目標對應為相等的按鈕,我們按下它的下乙個即可。
我の**
#include #include #include using namespacestd;int result=1<<30;
int result2=0;
int len=0;
void flipnum(char* a,inti)
else
}//比較是否相同
int cmpnum(char* a,char*b)
}return true;
}//設定反轉
void setarray(char* a,inti) else
result2++;
}//獲取次數最小的
int minnum(int i,intj)
intmain()
char c[35];
for(int p=0;p<2;p++)
}for(int i=0;i)}}
}if(result == 1<<30)
cout<<"impossible";
elsecout
}
我の小結
此外,因為我也算是乙個演算法學習上的新人,在很多細節處理的地方都不好。通過這個例子,我應該注意到,如果是最小的次數,一定要記得把所有的情況都經歷過一次,再取最小的。還有陣列設定長度的時候,最好設大一點點,可以提高容納錯誤的能力,另外就是一些常用函式的對應標頭檔案啊之類的要記憶一下qaq。
8469 特殊密碼鎖
總時間限制 1000ms 記憶體限制 1024kb 描述有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...
8469 特殊密碼鎖
總時間限制 1000ms記憶體限制 1024kb 描述 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左或者最右邊的按鈕,該按鈕只會影響到跟它相鄰的乙個...
OpenJudge 8469 特殊密碼鎖
中國mooc網,程式設計與演算法 二 第一周作業1 總時間限制 1000ms 記憶體限制 1024kb 有一種特殊的二進位制密碼鎖,由n個相連的按鈕組成 n 30 按鈕有凹 凸兩種狀態,用手按按鈕會改變其狀態。然而讓人頭疼的是,當你按乙個按鈕時,跟它相鄰的兩個按鈕狀態也會反轉。當然,如果你按的是最左...