试题 历届试题 翻硬币 java题解
试题 历届试题 翻硬币 java题解
问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出格式
一个整数,表示最小操作步数。
样例输入1
**********
o****o****
样例输出1
5
样例输入2
*o**o***o***
*o***o**o***
样例输出2
1
思路:看题我们可以知道只能两枚硬币一起反转然后让目标状态达到初始状态
所以很简单,只需要简单的判断当前硬币与初始硬币是否不同,然后当前硬币和当前硬币的后一个硬币进行反转就行了
在反转的时候,可以直接写一个方法来将硬币反转
出自:贵州电子商务职业技术学院
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 static int count=0; 6 static char z='*',f='o';//正面为 * 反面为 o 7 public static void main(String arg[]){ 8 Scanner input=new Scanner(System.in); 9 String a=input.next();10 String b=input.next();11 char startMod[]=a.toCharArray();12 char endMod[]=b.toCharArray();13 for (int i=0;i<startMod.length;i++){14 if (Arrays.equals(startMod,endMod))break;//如果两个字符数组相等就直接退出循环15 if (endMod[i]!=startMod[i]){//如果当前硬币和初始硬币不一样就会执行反转16 endMod[i]=Fz(endMod[i]);17 endMod[i+1]=Fz(endMod[i+1]);18 count++;19 }20 }21 System.out.println(count);22 }23 public static char Fz(char s){//使用方法将硬币反转24 if (s==f)return z;25 if (s==z)return f;26 return z;27 }28 }