找规律 2013蓝桥杯C/C++ B组8 翻硬币

题目:翻硬币

题目描述

小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:** oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作。

输入

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

输出

一个整数,表示最小操作步数。

样例输入

xoxxoxxxoxxx
xoxxxoxxoxxx

样例输出

1

思路
  1. 考虑两个字符串之间的差异,不同用1表示,相同用0表示,存在res数组中
  2. 问题转化为~如何将最邻近但不相邻的两个1,通过与相邻的0交换,成为一对相邻的1
  3. 扫一遍数组res,遇到单独的1就交换,直到配对成功,消去。遍历数组一遍,同时计数。
代码
#include<iostream>
#include<string>
using namespace std;
int res[10000];
int step;
int main()
{
	string str1,str2;
	cin >> str1 >> str2;
	int len = str1.length();

	for(int i=0;i<len;i++){
		if(str1[i]!=str2[i]){
			res[i] = 1;
		}
	}
	for(int i=0;i<len;i++){
		if(res[i]==1){
			if(res[i+1]==1){
				res[i]=0;
				res[i+1]=0;
				step++; 
			}else{
				swap(res[i],res[i+1]);
				step++;
			}
		}
	}
	cout << step;
	
	return 0;
}
  1. 可以用dfs,bfs
  2. 简化题目给出得例子,再找规律
发布了37 篇原创文章 · 获赞 1 · 访问量 2742

猜你喜欢

转载自blog.csdn.net/qq_39685968/article/details/104507388