2015-年蓝桥杯C-(A组)赛题-dfs-手链样式

手链样式


小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?


请你提交该整数。不要填写任何多余的内容或说明性的文字。
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <cstdlib>
#include <string>
#include <string.h>
#include <math.h>

int a[15];

using namespace std;
int sum=0;
int b[5]={0,3,4,5};
 int c[5];
 
 set<string> ss;
 
bool panduan(){
	int i,j;
	string s="";
	string s2="";
	char ch[10];
	char ch2[10];
	for(j=1;j<=12;j++){
		s="";
		s2="";
		for(i=j;i!=(13-j)/12*12+j-1;i=i%12+1){
			itoa(a[i],ch,10);
			itoa(a[13-i],ch2,10);
			s=s+ch;
			s2=s2+ch2;
		}
		itoa(a[i],ch,10);
		itoa(a[13-i],ch2,10);
		s=s+ch;
		s2=s2+ch2;
		
		if(ss.count(s)!=0)return false;
		if(ss.count(s2)!=0)return false;
	}
	s="";
	for(j=1;j<=12;j++){
		itoa(a[j],ch,10);
		s=s+ch;
	}
	
	ss.insert(s);
	return true;
	
}
void dfs(int n){
	
	if(n>12){
		if(panduan())sum++;
		return;
	}

		for(int j=1;j<=3;j++){
 
		    if(c[j]<=b[j]-1){
				a[n]=j;
		    	c[j]++;
		    	dfs(n+1);
		    	a[n]=0;
		    	c[j]--;
			}

	}
}


int main(){	
	memset(a,0,sizeof(a));
	memset(c,0,sizeof(a));
	ss.clear();
	dfs(1);
	cout<<sum<<endl;
	return 0;	
	
}


猜你喜欢

转载自blog.csdn.net/qq_34243930/article/details/79720864