国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

藍橋杯 歷屆試題 翻硬幣

2019-11-06 06:18:02
字體:
來源:轉載
供稿:網友

歷屆試題 翻硬幣 

   

問題描述

小明正在玩一個“翻硬幣”的游戲

桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。

比如,可能情形是:**oo***oooo

如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo

現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少次呢?

我們約定:把翻動相鄰的兩個硬幣叫做一步操作,那么要求:

輸入格式

兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。每行的長度<1000

輸出格式

一個整數,表示最小操作步數。

樣例輸入1**********o****o****樣例輸出15樣例輸入2*o**o***o****o***o**o***樣例輸出21 分析:從開始到末尾有不同的硬幣就翻轉,保證前面的都相同。剛開始用解答數做(抱著僥幸的心態),當然肯定超時了,然后就在網上找了一些解法。

AC代碼:

#include<cstdio>#include<cstring>using namespace std;const int maxn=1000+10;char a[maxn];char b[maxn];int main(){	while(scanf("%s%s",a,b)==2){		int len=strlen(a);				int tmp=0;		for(int i=0;i<len-1;i++){			if(a[i]!=b[i]){				tmp++;				if(a[i]=='*')				  a[i]='o';				 else a[i]='*';				if(a[i+1]=='*')				  a[i+1]='o';				 else a[i+1]='*';			}		}				PRintf("%d/n",tmp);	}	return 0;}

超時代碼!!!

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define INF 2147483647const int maxn=1000+10;char a[maxn];char b[maxn];int len;int minx;bool change(int sum,int cur){	if(strcmp(a,b)==0)	{	return true;	}		for(int i=cur;i<len-1;i++){			for(int j=i;j<=i+1;j++)				if(a[j]=='*')a[j]='o';			    else a[j]='*';		  if(change(sum+1,i+1)){		  minx=min(minx,sum+1);		  }		  for(int j=i;j<=i+1;j++)				if(a[j]=='*')a[j]='o';				else a[j]='*';		}		return false ;}int main(){	while(scanf("%s%s",a,b)==2){		minx=INF;		len=strlen(a);		if(change(0,0))		 printf("0/n");		else 		  printf("%d/n",minx);	}	return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹿泉市| 长宁县| 潼关县| 阜平县| 襄樊市| 呈贡县| 黔南| 响水县| 嘉峪关市| 会宁县| 滁州市| 育儿| 泰来县| 通化市| 宿州市| 元朗区| 神木县| 汤阴县| 盐津县| 莎车县| 吴忠市| 达州市| 阜平县| 慈利县| 金溪县| 威远县| 延寿县| 巩义市| 蒙自县| 玛纳斯县| 胶州市| 当雄县| 定结县| 韶山市| 枝江市| 双城市| 泉州市| 康保县| 津南区| 东安县| 永安市|