전형적인 열거 알고리즘의 세 가지 예

저작권 :에서 : 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;
} 

N은 2.M 돈 닭 문제를 구매

질문 : 5 개 수컷, 3 개 암탉, 닭 세 한 모든 가능한 솔루션 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 개 은색 동전, 가짜, 위조 지폐, 실제 돈이나 빛보다 무거운에게 세 가지 테스트로, 위조 지폐의 심각성을 알지 못한다.
분석 : 진실과 거짓 사이의 각 동전 테스트로 생각 리버스 상태가 될 수 있습니다.

#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의 사용은 ++, I는 대문자를 모른다.
내부의 휴식을 잊지 마세요 시간 스위치의 심각도를 결정합니다.

추천

출처blog.csdn.net/jihome/article/details/89162549