题意:给出6种颜色(可以有相同颜色),问将一个正方体用这些颜色上色的方案数.
两个方案相同,当其中一个方案可以通过旋转若干次得到另外一个方案.
面个数,颜色个数=6. 旋转方案有3种.
每种方案选择顺序不同 结果也不同.
两个方案相同,当其中一个方案可以通过旋转若干次得到另外一个方案.
面个数,颜色个数=6. 旋转方案有3种.
每种方案选择顺序不同 结果也不同.
枚举每个面的颜色后,BFS暴力计算重复的即可. O(6!*3).
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
string s;
queue<string> q;
map<string,int> mp;
void bfs(string s)
{
mp[s]=true;
q.push(s);
while(!q.empty())
{
string u=q.front(),v1,v2,v3;
q.pop();
v1=v2=v3=u;
v1[0]=u[3],v1[1]=u[0],v1[2]=u[1],v1[3]=u[2];
v2[0]=u[4],v2[5]=u[0],v2[2]=u[5],v2[4]=u[2];
v3[5]=u[1],v3[3]=u[5],v3[4]=u[3],v3[1]=u[4];
if(!mp[v1]) mp[v1]=true,q.push(v1);
if(!mp[v2]) mp[v2]=true,q.push(v2);
if(!mp[v3]) mp[v3]=true,q.push(v3);
}
}
int main()
{
cin>>s;
int res=0;
sort(s.begin(),s.end());
do{
if(mp[s]) continue;
res++;
bfs(s);
}while(next_permutation(s.begin(),s.end()));
cout<<res<<'\n';
return 0;
}