1208. 翻硬币 【递推】
思路:
你可以想象有9个开关来控制着这些硬币。
假如第一个和目标的第一个不相同。那么第一个开关必须使用,因为能让第一个硬币变得只有第一个开关。
依次类推,直到遍历完整个得数组。
其实你会发现,结果是唯一的一种。
#include<cstring>
#include<string>
#include<iostream>
#include<cstdio>
using namespace std;
int ans=0;
int main(void)
{
string str1,str2;
bool a[105],b[105];
cin>>str1>>str2;
for(int i=0;i<str1.size();i++)//将字符串转换成 0 1这种
{
if(str1[i]=='*')
{
a[i]=true;//true代表正面 false代表反面
}
else
{
a[i]=false;
}
if(str2[i]=='*')
{
b[i]=true;
}
else
{
b[i]=false;
}
}
for(int i=0;i<str1.length();i++)
{
if(a[i]!=b[i])
{
ans++;
a[i+1]=!a[i+1];//取反
}
}
printf("%d\n",ans);
return 0;
}
简单写法:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=105;
int n;
char start[N],aim[N];
void turn(int i)
{
if(start[i]=='*') start[i]='o';
else start[i]='*';
}
int main(void)
{
cin>>start>>aim;
int res=0;
n=strlen(start);
for(int i=0;i<n-1;i++)
{
if(start[i]!=aim[i])
{
turn(i),turn(i+1);
res++;
}
}
cout<<res<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
string a,b;
int main(void)
{
cin>>a>>b;
int ans=0;
for(int i=1;i<b.size();i++)
{
if(b[i-1]!=a[i-1])
{
b[i-1]=a[i-1];
if(b[i]=='*') b[i]='o';
else b[i]='*';
ans++;
}
}
cout<<ans;
return 0;
}