【问题描述】
问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:** oo *** oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出格式
一个整数,表示最小操作步数。
样例输入1
“ ********** ”
“ o **** o **** ”
样例输出1
5
样例输入2
*o ** o *** o ***
*o *** o ** o ***
样例输出2
1
【解题思路】
先将第一行存入数组 a 中,第二行存入数组 b 中,递归调用:
从 n=0 到 n=a.length
(1)如果 a[n] == b[n] ,则 n+1 ,比较数组下一个值;
(2)如果 a[n] != b[n] ,则 b[n] = a[n],并将 **b[n+1]**改为相反的字符,改的次数加一,继续比较数组下一个值;
(3)递归完即可得到改的次数。
【解决代码】
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);
}
}
}
}