//本来是按位置的差来做的,后来没想到怎么表示两个字符串不同的位置啥的= =
//因为要考虑a b不同,到底是翻了之后不同还是本来自带的不同
//齐天大坑结束:),用时1h20min发现自己想的错的:),如果把差分成两个字符串比较出现不同于(次数多的ch)这一个的次数,那就要考虑如果两个是相连的怎么办?
如:*****
oooo*
然后就越想越复杂了:)
没忍住搜了,发现soeasy啊= =,自己还是应该多试试其他方法,虽然主线思想都一样
#include <iostream>
using namespace std;
int main()
{
char s1[1000];
char s2[1000];
int cr[1000]; //记录两个字符串的比较结果。0为相同,1为不同。
while(cin>>s1){
cin>>s2;
int l;
for(l=0;s1[l]!='\0';l++); //计算长度
for(int i=0;i<l;i++){ //比较两个字符串,并记录结果
if(s1[i]==s2[i])
cr[i]=0;
else
cr[i]=1;
}
int f=-1; //记录标记位
int _count=0;
for(int i=0;i<l;i++){
if(cr[i]==1){ //检测到一个 1
if(f==-1){ //如果前面没有记录的1的下标,记录当前1的下标
f=i;
}
else{ //如果前面有一个1了
_count+=i-f;
f=-1;
}
}
}
cout<<_count<<endl;
}
return 0;
}
Description
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
Input
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
Output
一个整数,表示最小操作步数。
Sample Input
样例输入1 ********** o****o**** 样例输入2 *o**o***o*** *o***o**o***
Sample Output
样例输出1 5 样例输出2 1
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str1 = input.next();
String str2 = input.next();
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int count = 0;
for (int i = 0; i < arr2.length -1; i++) {
if (arr1[i] != arr2[i]) {
arr1[i] = arr2[i];
if (arr1[i+1] =='*') {
arr1[i+1] ='o';
}else {
arr1[i+1] ='*';
}
count++;
}
}
System.out.println(count);
}
}