HDU 4801 Pocket Cube

题意:

问魔方在N步内,最多可以还原几个面

思路:暴力

#include<bits/stdc++.h>
using  namespace std;
int p[3][3][4]={	
{{1,21,17,7},{8,9,15,14},{3,23,19,13}},
{{1,4,18,15},{23,22,20,21},{0,10,19,9}},
{{23,8,6,4},{0,1,3,2},{22,9,7,5}}
};
int a[25];
int maxx;
int judge()
{
	int f=0;
	if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]) f++;
	if(a[4]==a[5]&&a[5]==a[10]&&a[10]==a[11]) f++;
	if(a[6]==a[7]&&a[7]==a[12]&&a[12]==a[13]) f++;
	if(a[8]==a[9]&&a[9]==a[14]&&a[14]==a[15]) f++;
	if(a[16]==a[17]&&a[17]==a[18]&&a[18]==a[19]) f++;
	if(a[20]==a[21]&&a[21]==a[22]&&a[22]==a[23]) f++;
	return f;
}
void pdo(int k)
{
	int b[4];
	for(int i=0;i<3;i++)
	{
		b[0]=a[p[k][i][0]];
		b[1]=a[p[k][i][1]];
		b[2]=a[p[k][i][2]];
		b[3]=a[p[k][i][3]];
	    a[p[k][i][0]]=b[3];
		a[p[k][i][1]]=b[0];
		a[p[k][i][2]]=b[1];
		a[p[k][i][3]]=b[2];
	}
	
}
void dfs(int n)
{
	
	maxx=max(judge(),maxx);
	if(maxx==6) return ;
	if(n==0) return ;
	for(int i=0;i<3;i++)
	{
		pdo(i);
		dfs(n-1);
		if(maxx==6) return ;
		pdo(i);
		pdo(i);
		dfs(n-1);
		if(maxx==6) return ;
		pdo(i);
	}
}
int main()
{
	int T;
	
	while(~scanf("%d",&T))
	{
		for(int i=0;i<24;i++)
		scanf("%d",a+i);
		maxx=0;
		dfs(T);
		printf("%d\n",maxx);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值