手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
请你提交该整数。不要填写任何多余的内容或说明性的文字。
小明有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;
}