1045: 纸牌游戏
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 20 Solved: 10
[Submit][Status][Web Board]
Description
给你N张纸牌,一字排开,纸牌有正反面,正面写有0,反面写有1。开始的纸牌可能是一种乱的状态(有0有1)现在你需要整理这些纸牌。但麻烦的是,每当你翻一张纸牌时,他左右两张纸牌也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多组数据,每组数据输入一行01符号串(长度20以内),0表示正面朝上,1表示反面朝上。
Output
对于每组数据,如果可以翻称全都是正面,输出最少需要翻动的次数,否则输出NO。
Sample Input
01 011
Sample Output
NO 1
这道题就看我是翻第一张还是不翻第一张,因为第一张决定后面的纸牌顺序,所以分情况讨论即可
/*
看翻不翻第一张,第一张由自己或者第二张决定
如果前一张为0就不变为1就变
*/
# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
string str1, str2;
while(cin >> str1)
{
str2 = str1;
int s1 = 0, s2 = 0;
bool flag1 = false, flag2 = false;
//从头开始
if(str1[0] == '1')
{
str1[0] = '0';
if(str1[1] == '0')
{
str1[1] = '1';
}
else
{
str1[1] = '0';
}
}
else
{
str1[0] = '1';
if(str1[1] == '0')
{
str1[1] = '1';
}
else
{
str1[1] = '0';
}
}
s1++;
for(int i = 1; i < str1.size(); i++)
{
if(str1[i - 1] == '1')
{
str1[i - 1] = '0';
if(str1[i] == '0')
{
str1[i] = '1';
}
else
{
str1[i] = '0';
}
if(i + 1 < str1.size())
{
if(str1[i + 1] == '1')
{
str1[i + 1] = '0';
}
else
{
str1[i + 1] = '1';
}
}
s1++;
}
}
//从第二个开始
for(int i = 1; i < str2.size(); i++)
{
if(str2[i - 1] == '1')
{
str2[i - 1] = '0';
if(str2[i] == '0')
{
str2[i] = '1';
}
else
{
str2[i] = '0';
}
if(i + 1 < str2.size())
{
if(str2[i + 1] == '1')
{
str2[i + 1] = '0';
}
else
{
str2[i + 1] = '1';
}
}
s2++;
}
}
// cout << "s1 = "<<s1 << endl;
// cout << "s2 = "<< s2 << endl;
// cout << flag1 << " " << flag2 << endl;
int pos = str1.find('1');
if(pos != string::npos)
{
flag1 = true;
}
pos = str2.find('1');
if(pos != string::npos)
{
flag2 = true;
}
// cout << flag1 << " " << flag2 << endl;
if(flag1)
{
if(flag2)
{
cout << "NO" << endl;
}
else
{
cout << s2 << endl;
}
}
else
{
if(flag2)
{
cout << s1 << endl;
}
else
{
cout << (s1 < s2 ? s1 : s2) << endl;
}
}
}
}