历届试题 翻硬币
题目描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:oo*oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入解释
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出解释
一个整数,表示最小操作步数。
输入样例
样例输入1
oo
样例输入2
ooo***
ooo***
输出样例
样例输出1
5
样例输出2
1
```import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String s1=in.nextLine();
String s2=in.nextLine();
String str1[]=s1.split("");
String str2[]=s2.split("");
int count=0;
int i1=0;//索引
for(int i=0;i<str1.length-1;i++) {
i1=i;
if(!str1[i1].equals(str2[i1])) {
count++;
str1[i1]=str2[i1];
if(str1[i1+1].equals("*")) {
str1[i1+1]="o";
}
else str1[i1+1]="*";
}
}
if(!str1[str1.length-1].equals(str2[str1.length-1])) {
count++;
}
System.out.println(count);
}
}
```方法二递归:
import java.util.Scanner;
public class Change_coins {
static int sum=0;
public static void main(String[] args) {
Scanner re=new Scanner(System.in);
System.out.println("enter:");
String first=re.nextLine();
String second=re.nextLine();
char a[]=first.toCharArray();
char b[]=second.toCharArray();
find(a, b, 0);
System.out.println(sum);
re.close();
}
static void find(char a[],char b[],int n) {
if(n<a.length) {
if(a[n]==b[n]) {
find(a, b, n+1);
}else {
b[n]=a[n];
if(b[n+1]=='*')
b[n+1]='o';
else
b[n+1]='*';
sum++;
find(a, b, n+1);
}
}
}
}