典型的な列挙アルゴリズムの三つの例

著作権:から:Jihome https://blog.csdn.net/jihome/article/details/89162549

1.ファジィ数

問題:10001百知らない番号5、が、それは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;
} 

Nは2.mお金鶏の問題を購入します

質問:5人の男性、3羽の雌鶏、ニワトリ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直接両者の合計数を得て、その後は、少なくとも1サイクルを決定します。作業効率が大幅に向上します。

3.本物の銀

質問:12枚の銀貨、偽物は、偽札、本当のお金や光より重いを頼む3つのテストに、偽札の厳しさを知りません。
分析:条件はすることができ、真と偽の間の各コインのテストで、思考を逆転。

#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の使用++文字が残って定義し、なぜ、私は、最初の文字が小文字でない場合よりも、右、与えられていないの後に大文字を知りません。
内部の休憩を忘れてはいけないタイムスイッチの重症度を決定します。

おすすめ

転載: blog.csdn.net/jihome/article/details/89162549