problem description
有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態(有些朝正,有些朝反),現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌(由正翻到反,或者有反翻到正)時,他左右兩張紙牌(最左邊和最右邊的紙牌,只會影響附近一張)也必須跟著翻動,現在給你乙個亂的狀態,問你能否把他們整理好,使得每張紙牌都正面朝上,如果可以,最少需要多少次操作。
input
有多個case,每個case輸入一行01符號串(長度不超過20),1表示反面朝上,0表示正面朝上。
output
對於每組case,如果可以翻,輸出最少需要翻動的次數,否則輸出no。
sample input
01011
sample output
no1
很懵逼,題目意思有毒,只會影響附近的一張導致我以為只會影響左邊或者右邊兩者中的一張。。。。。
分析:從最終結果出發不管最終紙牌翻轉成什麼樣,第一張紙牌只有兩種情況:1.翻轉過,2:未翻轉過
而影響第一張紙牌的只有本身和第二張紙牌,
所以分兩種情況:1:第一張紙牌本身翻轉,然後搜尋第2,3,4,....n張並由第i-1張紙牌是否正面朝上而決定第i張是否翻轉(第i-1張紙牌前的紙牌已全部正面朝上),最後只需要判斷第n張紙牌是否正面朝上即可
2:第一張紙牌本身不翻轉,然後過程和第1種情況一樣
dfs
#include#include#includeusing namespace std;
const int inf = 0x3f3f3f3f;
int num[30];
int dfs(int pos, int len, int tol)
int main()
return 0;
}
bfs+位運算
#include#include#include#includeusing namespace std;
const int maxn = (1<<20) + 10;
bool vis[maxn];
struct node
node(int _num, int _step) : num(_num), step(_step){}
};int main()
{ char p[25];
while(scanf("%s", p) != eof)
{int now = 0;
memset(vis, false, sizeof(vis));
int len = strlen(p);
for(int i = 0; i < len; i++)
now = now | (p[i] - '0') << i;
/*1.p[i]-'0',將字元『0』與『1』轉化為數0與1
2.(p[i]-'0')node tem(now, 0);
q.push(tem);
while(!q.empty())
{tem = q.front();
if(!tem.num)
break;
q.pop();
for(int i = 0; i < len; i++)
{now = tem.num^1<
HDU 2209 翻紙牌遊戲(DFS)
description 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 也必須跟著翻動,...
HDU 2209 翻紙牌遊戲(C C )
problem description 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 ...
HDU 2209 翻紙牌遊戲 模擬
有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 也必須跟著翻動,現在給你乙個亂的狀態,問...