【蓝桥杯历届试题】Java实现翻硬币

【问题描述】

问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:** oo *** oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000

输出格式
一个整数,表示最小操作步数。

样例输入1
“ ********** ”
“ o **** o **** ”
样例输出1
5
样例输入2
*o ** o *** o ***
*o *** o ** o ***
样例输出2
1

【解题思路】

先将第一行存入数组 a 中,第二行存入数组 b 中,递归调用:
n=0n=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);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42908549/article/details/104138940