HDU2209 翻纸牌游戏
2017-08-07 11:29
351 查看
Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
Sample Input
01
011
Sample Output
NO
1
Author
wangye
這是一個最為基礎的反轉——開關、燈泡問題。現在的情況是在最基礎之上進行了改動,現在轉中間的會帶動兩邊的轉動,我們依然可以看作是轉動一個帶動後面兩個紙牌。唯一不同的則是對於第一個紙牌的判定,可以自己翻,也可以由前面的牌帶動翻。所以我們要在前面添加一個元素並且使其為1來帶動真正意義上的第一張牌轉動。
具體過程演示:
舉個栗子:
0110
變換后:
1 0110 0
solve1 ():
1 0110 0——>1 0001 0——>return NO
sovle 2():
1 0110 0——>0 1010 0——>0 0100 0——>0 0011 0——>0 0000 1
——>return 4
值得注意的是solve1(),solve2()只需要調用一次,實參進行改變,數組會更新,切記!
AC代碼:
4000
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
Sample Input
01
011
Sample Output
NO
1
Author
wangye
這是一個最為基礎的反轉——開關、燈泡問題。現在的情況是在最基礎之上進行了改動,現在轉中間的會帶動兩邊的轉動,我們依然可以看作是轉動一個帶動後面兩個紙牌。唯一不同的則是對於第一個紙牌的判定,可以自己翻,也可以由前面的牌帶動翻。所以我們要在前面添加一個元素並且使其為1來帶動真正意義上的第一張牌轉動。
具體過程演示:
舉個栗子:
0110
變換后:
1 0110 0
solve1 ():
1 0110 0——>1 0001 0——>return NO
sovle 2():
1 0110 0——>0 1010 0——>0 0100 0——>0 0011 0——>0 0000 1
——>return 4
值得注意的是solve1(),solve2()只需要調用一次,實參進行改變,數組會更新,切記!
AC代碼:
#include<iostream> #include<cstring> #include<string> #include<queue> #include<algorithm> using namespace std; #define ll long long int #define INF 0x3f3f3f3f int a[25]; int b[25]; string str; int solve1(); int solve2(); void solve(); int min(int p, int q) { if (p < q) return p; else return q; } int sum(string str,int a[]) { int t = str.length(); int ans = 0; for (int i = 1; i <= t; i++) { ans += a[i]; } if (ans) return 0; else return 1; } void back(int k,int a[]) { if (a[k]) { a[k] = 0; } else { a[k] = 1; } } void change(int i,int a[]) { back(i,a); back(i + 1,a); back(i + 2,a); } void solve() { int s1 = solve1(); int s2 = solve2(); if (s1 == -1) { if (s2 == -1) { cout << "NO" << endl; } else { cout << s2 << endl; } } else { if (s2 == -1) { cout << s1 << endl; } else { cout << min(s1, s2) << endl; } } } int solve1()//第一個位置不反轉 { int time = 0; for (int i = 1; i < str.length(); i++)//! { if (b[i]) { change(i,b); time++; } } if (sum(str,b)) { return time; } else { return -1; } } int solve2() //第一個位置反轉 { a[0] = 1; int time = 0; for (int i = 0; i < str.length(); i++)//! { if (a[i]) { change(i,a); time++; } } if (sum(str,a)) { return time; } else { return -1; } } int main() { while (cin>>str) { a[0] = 0; b[0] = 0; for (int i = 0; i < str.length(); i++) { b[i+1]=a[i+1] = str[i] - '0';//轉換成整型數組來進行 } if (str.length() == 1) { if (a[1]) cout << "1" << endl; else cout << "0" << endl; continue; } b[str.length() + 1] = 0; a[str.length() + 1] = 0; solve(); } return 0; }
4000
相关文章推荐
- Hdu2209 翻纸牌游戏
- hdu2209翻纸牌游戏(双向bfs)
- 翻纸牌游戏 hdu2209
- csdn英雄会题解之翻纸牌游戏__hdu2209
- HDU2209 翻纸牌游戏【技巧】
- hdu2209翻纸牌游戏
- HDU2209-翻纸牌游戏
- hdu2209翻纸牌游戏(bfs+状态压缩)
- HDU2209:翻纸牌游戏(DFS)
- HDU2209翻纸牌游戏(位运算+搜索)
- HDU2209:翻纸牌游戏(DFS)
- hdu2209 翻纸牌游戏--BFS & 位运算 & 状态压缩(待解决)
- hdu2209翻纸牌游戏
- 纸牌游戏
- 猜纸牌游戏之一 界面设计和资源文件的设计
- 杭电2209 翻纸牌游戏(BFS)
- hdu 2209 翻纸牌游戏【贪心】
- hdoj 2209 翻纸牌游戏 【dfs】
- 24点纸牌游戏计算器
- Hdu 2209 翻纸牌游戏[初识状态压缩]