翻硬币
题目
问题描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:* * oo* * * oooo
如果同时翻转左边的两个硬币,则变为:oooo* * * oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币, 那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出格式
一个整数,表示最小操作步数。
样例输入1
* * * * * * * * * *
o* * * * o* * * *
样例输出1
5
样例输入2
* o* * o* * * o* * *
* o* * * o* * o* * *
样例输出2
1
代码1
import java. util. Scanner;
public class 翻硬币 {
static String s1;
static String s2;
static int max= 0 ;
static int sum1, sum2;
static int index= 0 ;
static int num= 0 ;
public static void main ( String[ ] args) {
Scanner sc= new Scanner ( System. in) ;
s1= sc. next ( ) ;
s2= sc. next ( ) ;
char [ ] a1= s1. toCharArray ( ) ;
char [ ] a2= s2. toCharArray ( ) ;
int n= s1. length ( ) ;
for ( int i= 0 ; i< n; i++ ) {
pk ( a1, a2) ;
if ( index== 0 ) {
for ( int j= 0 ; j< n; j++ ) {
if ( a1[ j] == a2[ j] )
continue ;
else {
num++ ;
if ( a2[ j] == 'o' ) {
a2[ j] = '*' ;
if ( a2[ j+ 1 ] == 'o' )
a2[ j+ 1 ] = '*' ;
else
a2[ j+ 1 ] = 'o' ;
} else {
a2[ j] = 'o' ;
if ( a2[ j+ 1 ] == 'o' )
a2[ j+ 1 ] = '*' ;
else {
a2[ j+ 1 ] = 'o' ;
}
}
}
}
} else {
for ( int j= n- 1 ; j>= 0 ; j-- ) {
if ( a2[ j] == a2[ j] )
continue ;
else {
num++ ;
if ( a2[ j] == 'o' ) {
a2[ j] = '*' ;
if ( a2[ j+ 1 ] == 'o' )
a2[ j+ 1 ] = '*' ;
else
a2[ j+ 1 ] = 'o' ;
} else {
a2[ j] = 'o' ;
if ( a2[ j+ 1 ] == 'o' )
a2[ j+ 1 ] = '*' ;
else
a2[ j+ 1 ] = 'o' ;
}
}
}
}
}
System. out. println ( num) ;
}
private static void pk ( char [ ] a1, char [ ] a2) {
int n= a1. length;
sum1= 0 ; sum2= 0 ;
for ( int i= 0 ; i< n; i++ ) {
if ( a1[ i] == a2[ i] )
sum1++ ;
if ( a1[ n- i- 1 ] == a2[ n- i- 1 ] )
sum2++ ;
}
if ( sum1>= sum2)
index= 0 ;
else
index= 1 ;
}
}
import java. util. Scanner;
public class 翻硬币1 {
public static void main ( String[ ] args) {
Scanner in = new Scanner ( System. in) ;
String A = in. next ( ) ;
String B = in. next ( ) ;
int sum = 0 ;
char [ ] a= A. toCharArray ( ) ;
char [ ] b= B. toCharArray ( ) ;
for ( int i= 0 ; i< a. length- 1 ; i++ ) {
if ( a[ i] != b[ i] ) {
reverse ( a, i) ;
reverse ( a, i+ 1 ) ;
sum++ ;
}
}
System. out. println ( sum) ;
}
private static void reverse ( char [ ] a, int i) {
if ( a[ i] == 'o' )
a[ i] = '*' ;
else if ( a[ i] == '*' )
a[ i] = 'o' ;
}
}