[蓝桥杯][历届试题]翻硬币 (C语言代码)

翻硬币

时间限制: 1Sec 内存限制: 128MB

题目描述
小明正在玩一个“翻硬币”的游戏。

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

比如,可能情形是:11oo111oooo

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

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

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出
一个整数,表示最小操作步数。
样例输入
1o11o111o111
1o111o11o111
样例输出
1
看着想了想还是去模拟翻硬币的过程
每次翻2块
so
我们每次遍历输入的字符串与最终的字符串第一处不同
然后翻转该处硬币,计数器flag++,后一直循环直到后面的硬币直到完全一样break输出flag

#include<stdio.h>
#include<string.h>
int main()
{
    
    
	int k=0,flag=0,l;
	char a[1000],end[1000];
	gets(a);
	gets(end);
	l=strlen(a);
	while(1)
	{
    
    
		for(;k<l;k++)
		{
    
    
		if(a[k]!=end[k])
			break;		
		}				
		if(k>=l)
		break;	
		if(a[k]=='*')
		a[k]='o';
		else
		a[k]='*';
		if(a[k+1]=='*')
		a[k+1]='o';
		else
		a[k+1]='*'; 
		flag++;	
	}
	printf("%d",flag);
	return 0;
}

还有一种反法就是找到其规律。。。。。。。反正我是没发现
就是找到不同出的坐标。所有两个相邻的上’o’下‘’ 和’o’下‘’的差加所有两个相邻的下’o’上’‘和下’o’上’'之差便为翻硬币次数。
1 o 1 1 o 1 1 1 o 1 1 1
1 o 1 1 1 o 1 1 o 1 1 1
1 2 3 4 5 6 7 8 9 10 11 12
6-5+0-0=1;
就这样了。代码有空补上。

猜你喜欢

转载自blog.csdn.net/qq_52425315/article/details/112563964