翻硬幣
- 1.題目
- 2.基本思想
- 3.代碼實現
1.題目
小明正在玩一個“翻硬幣”的游戲。
桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反(是小寫字母,不是零)。
比如,可能情形是:**oo***oooo
如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo
現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少呢?
我們約定:把翻動相鄰的兩個硬幣叫做一步操作。
輸入格式
兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。
輸出格式
一個整數,表示最小操作步數
數據范圍
輸入字符串的長度均不超過100。
數據保證答案一定有解。
輸入樣例1:
**********
o****o****
輸出樣例1:
5
輸入樣2:
*o**o***o***
*o***o**o***
輸出樣例2:
1
2.基本思想
如果通過每次翻轉兩枚相鄰硬幣,能從狀態一變為狀態二,則兩個狀態之間必定有偶數個不同狀態的硬幣。
模擬法:
從最左側開始遍歷,如果該位置硬幣狀態與目標不同,就翻動該位置和該位置后面的兩枚硬幣。
因為題目說了有解,所以遍歷到倒數第二枚的時候,所有硬幣狀態就與目標相同了。
3.代碼實現
import java.io.*;public class Main {static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static char[] start = new char[110], aim = new char[110];private static void turn(int i) {if (start[i] == '*') start[i] = 'o';else start[i] = '*';}public static void main(String[] args) throws IOException {start = br.readLine().toCharArray();aim = br.readLine().toCharArray();int cnt = 0;//計數for (int i = 0; i < start.length; i++)if (start[i] != aim[i]) {turn(i);turn(i + 1);cnt++;}System.out.println(cnt);}
}