问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,
那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出格式
一个整数,表示最小操作步数。
样例输入1
**********
o****o****
样例输出1
5
代码如下:
import java.util.Scanner;
public class 翻硬币 {
/**
* 容易忽略的问题:需要翻硬币有可能不是连续,就是说有两段需要去翻:列:
* *o**o***o******o
*o***o**o*****o*
这个就是左右有两段,所以我们在比较的时候需要分别寻找出两段的起始值和终止值
然后在进行计数
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
//转化为字符数组
char ch []=a.toCharArray();
char ch1[]=b.toCharArray();
//设置一个起始值和终止值
int start = 0;int stop = 0;
int sum = 0; //设置一个变量用来储存总次数
int s = 0; //用来计数,
for (int i = 0; i <ch1.length; i++) {
if (ch[i]!=ch1[i]) { //进行比较
s++; //自增,当自增两次时候说明第二次是终止值
if(s==2){ //终止值
stop=i;
}else { //起始值
start = i;
}
if (s>1) { //如果有对不一样了,说明找到了一段,
sum+=(stop-start); //终止位置-起始位置就是需要翻硬币的次数
s=0; //我们需要把s赋值为0,因为我们需要去找第二段
}
}
}
System.out.println(sum);
}
}
程序运行结果如下
*o**o***o***
*o***o**o***
1