翻硬币

来源:互联网 发布:商家怎么用淘宝客推广 编辑:程序博客网 时间:2024/04/30 01:47
问题描述
小明正在玩一个“翻硬币”的游戏。


桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。


比如,可能情形是:**oo***oooo


如果同时翻转左边的两个硬币,则变为:oooo***oooo


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


我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:


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


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


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

1

import java.util.*;public class Main  {  public static void rev(StringBuilder s,int st,int ed)//包括开头,但是不会包括结尾。{//s.substring(0, 1);比如这个就是指第一个字符if(s.substring(st, ed).equals("**")){s.replace(st, ed, "oo");}else if(s.substring(st, ed).equals("*o")){s.replace(st, ed, "o*");}else if(s.substring(st, ed).equals("o*")){s.replace(st, ed, "*o");}else if(s.substring(st, ed).equals("oo")){s.replace(st, ed, "**");}}    public static void main(String[] arg)      {      Scanner sc=new Scanner(System.in);        String x=sc.next();        StringBuilder m=new StringBuilder(x);        String y=sc.next();        StringBuilder n=new StringBuilder(y);        int count=0;        while(true)        {        if(m.toString().equals(n.toString()))//不是等号        {        break;        }        for(int i=0;i<m.length();i++)        {        if(m.charAt(i)!=n.charAt(i))//只看当前的情况        {        count++;        if(i==m.length()-1)        {        rev(m,i-1,i+1);        }        else        {        rev(m,i,i+2);        }                }                }        }        System.out.println(count);            }}













0 0