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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章