枚举算法典型的三个例子

版权声明:from:Jihome https://blog.csdn.net/jihome/article/details/89162549

1.模糊数字

问题:一个五位数,万位和百位不知道,但是是57和67的倍数,求所有的可能性。
分析:直接枚举所有情况,判断即可。

#include <iostream>
using namespace std;
int main(){
	int w,q,b,s,g;
	int sum,i,count=0,j;
	int n[10];
	cin>>q>>s>>g;
	while((q!=-1)||(s!=-1)||(g!=-1)){
	
		sum=q*1000+s*10+g;
		for(j=1;j<10;j++) {		
		for(i=0;i<10;i++){
			sum=sum+i*100+j*10000;
			if(sum%57==0&&sum%67==0)
			{
				n[count++]=sum;
			}
		}
	}
		cout<<count<<" ";
		for(i=0;i<count;i++){
			cout<<n[i]<<" ";
		}
		count=0;
		cout<<endl;
		cin>>w>>q>>s>>g;
	};
	return 0;
} 

2.m钱买n鸡问题

问题:公鸡5,母鸡3,三小鸡1,求m钱n鸡的所有可能解。
分析:暴力求解,三重循环(可以简化成双重循环)。

#include <iostream>
using namespace std;
int main(){
	int m,n,count=0;
	int i,j,k;
	Maybe M[100];
	cin>>m>>n;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			for(k=0;k<n;k++){
				if((i+k+j==n)&&(i*5+j*3+k/3.0==m)){
					count++;
				}
			}
		}
	}
	cout<<count<<endl;
	return 0;
} 

改进方法:
k直接用总数减两个,再判断,少一个循环。 运行效率大大提高。

3. 真假银币

问题:12个银币,1个假的,不知道假币的轻重,给三次测试,问假币是哪个,比真币重还是轻。
分析:逆向思维,用每个银币试真假,满足条件即可。

#include <iostream>
#include <cstring>
using namespace std;
bool isHeavy(char );
bool isLight(char );

char Left[3][10],Right[3][10],Than[3][10];

int main(){
	int n,i;
	char c;
	cin>>n;
	while(n--){
		for(i=0;i<3;i++){
			cin>>Left[i]>>Right[i]>>Than[i];
		}
			for(c='A';c<='L';c++){
				if(isLight(c)){
					cout<<c<<" "<<"light"<<endl;
					break;
				}
				if(isHeavy(c)){
					cout<<c<<" "<<"heavy"<<endl;
					break;
				}
			}
	}
	return 0;
} 

bool isHeavy(char c){
	for(int i=0;i<3;i++){
		switch(Than[i][0]){
			case 'u':
				if(strchr(Left[i],c)==NULL)
					return false;break;
			case 'e':
				if((strchr(Left[i],c)!=NULL)||(strchr(Right[i],c)!=NULL))
					return false;break;
			case 'd':
				if(strchr(Right[i],c)==NULL)
					return false;break;
		}
	}
	return true;
}

bool isLight(char c){
	for(int i=0;i<3;i++){
		switch(Than[i][0]){
			case 'u':
				if(strchr(Right[i],c)==NULL)
					return false;break;
			case 'e':
				if((strchr(Left[i],c)!=NULL)||(strchr(Right[i],c)!=NULL))
					return false;break;
			case 'd':
				if(strchr(Left[i],c)==NULL)
					return false;break;
		}
	}
	return true;
}

坑警告:用的DevC++,不知道为什么char 定义left,right,than 首字母不能小写,大写后不报错。
判断轻重的时候switch 里面不要忘记了break。

猜你喜欢

转载自blog.csdn.net/jihome/article/details/89162549