题目标题:翻硬币
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
程序输出:
一个整数,表示最小操作步数
例如:
用户输入:
**********
o****o****
程序应该输出:
5
再例如:
用户输入:
*o**o***o***
*o***o**o***
程序应该输出:
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
程序输入:
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
程序输出:
一个整数,表示最小操作步数
例如:
用户输入:
**********
o****o****
程序应该输出:
5
再例如:
用户输入:
*o**o***o***
*o***o**o***
程序应该输出:
1
/*
1,将这两串字符串存放在数组中
2,然后逐一比较,发现不同则与其后者一起翻转 ,再比较,重复上述操作
3,设置一个计数器,记录发生了多少次翻转即可。
#include<stdio.h>
int main()
{
int i=0,j;
int a[1000],b[1000];
int x;
for(j=0;j<2;)
{
x=getchar();
if(x=='o'||x=='*')
{
ungetc(x, stdin);
scanf("%d",&x);
a[i]=x;
i++;
}
else if(x=='\n')
{
j++;
}
}
return 0;
}
上面是失败的程序,没有掌握正确的输入方式,不会使用eof(end of file)
下面的解法很值得借鉴学习。
*/
# include <stdio.h>
int turn(int a[], int b[])
{
int n=0;
int i=0;
for(i=0; a[i]!=EOF; i++) //从前往后,依次查找,如果不同则B进行翻转
{ if(a[i]==b[i])
{ //如果相等 ,不做判断
continue;
} else {
b[i+1]=(b[i+1]=='*'?'o':'*'); //条件运算符,b[i+1]的值反转,如果为*则为0如果为0则为*
n++; //由于只循环一次,因此只用下一个翻转就可以了,当前值不用翻转。
}
}
return n;
}
int main()
{
int a[1000],b[1000];
int c,i=0,j=0;
while((c=getchar())!='\n')
{ //输入初始状态 "!="符号先执行左边的,后执行右边的,所以可以判断是否遇到了回车
a[i++]=c; //输入带累加
}
a[i]=EOF; // 设定结束的标记位 ,循环到这里就结束
while((c=getchar())!='\n'&&j<=i) //若此处不加j<=i虽然运行结果也正确,但评测系统里不会得分,出现运行错误。
{ //输入目标状态
b[j++]=c;
}
b[j]=EOF;
printf("%d\n", turn(a, b));
return 0;
}