Round 78C. Help Victoria the Wise 暴力(旋转),BFS

本文介绍了一种使用C++实现的算法,通过BFS遍历所有可能的正方体染色方案,并排除旋转重复的情况,最终计算出不重复的染色方案总数。适用于颜色数量等于面数为6的情况。
题意:给出6种颜色(可以有相同颜色),问将一个正方体用这些颜色上色的方案数.
两个方案相同,当其中一个方案可以通过旋转若干次得到另外一个方案.

面个数,颜色个数=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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值