翻紙牌遊戲一

2021-06-21 12:55:12 字數 1254 閱讀 7211

看到乙個紙牌演算法,第乙個看著有意思的程式設計了。

有好幾種程式設計方式,我說一下簡單的一種。

有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態(有些朝正,有些朝反),現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌(由正翻到反,或者有反翻到正)時,他左右兩張紙牌(最左邊和最右邊的紙牌,只會影響附近一張)也必須跟著翻動,現在給你乙個亂的狀態,問你能否把他們整理好,使得每張紙牌都正面朝上,如果可以,最少需要多少次操作。

有多個case,每個case輸入一行01符號串(長度不超過20),1表示反面朝上,0表示正面朝上。

對於每組case,如果可以翻,輸出最少需要翻動的次數,否則輸出no。

輸入:

01011

輸出:no1

分析:從最終結果出發不管最終紙牌翻轉成什麼樣,第一張紙牌只有兩種情況:1.翻轉過,2:未翻轉過

而影響第一張紙牌的只有本身和第二張紙牌,

所以分兩種情況:1:第一張紙牌本身翻轉,然後搜尋第2,3,4,....n張並由第i-1張紙牌是否正面朝上而決定第i張是否翻轉(第i-1張紙牌前的紙牌已全部正面朝上),最後只需要判斷第n張紙牌是否正面朝上即可

2:第一張紙牌本身不翻轉,然後過程和第1種情況一樣

#include#include#include

#define inf 99999999  

using namespace std;  

const int max=20+1;  

char s[max];//輸入的字元10011,char型  

int p[max];  

int dfs(int i,int len,int num)  

int main(){  

while(cin>>s){  

int len=strlen(s);  

for(int i=0;ip[i]=s[i]-'0';  //將s賦給p

int sum=inf;  

p[0]=!p[0],p[1]=!p[1];//使用第一種情況,翻轉第一位 ,無論第一位是0或一 

sum=min(sum,dfs(1,len,1));//翻轉第一位   

for(int i=0;ip[i]=s[i]-'0';  

sum=min(sum,dfs(1,len,0));//不翻轉第一位 ,將第一種方法的sum與第二種的比較,選取最小值。  

if(sum == inf)

cout<<"no"

翻紙牌遊戲

題目描述 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 也必須跟著翻動,現在給你乙個亂...

翻紙牌遊戲

翻紙牌遊戲 time limit 3000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 2209 description 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙...

1201 翻紙牌遊戲 ZCMU

有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 也必須跟著翻動,現在給你乙個亂的狀態,問...