Pocket Cube

Pocket Cube is a 3-D combination puzzle. It is a 2 × 2 × 2 cube, which means it is constructed by 8 mini-cubes. For a combination of 2 × 2 mini-cubes which sharing a whole cube face, you can twist it 90 degrees in clockwise or counterclockwise direction, this twist operation is called one twist step.

Considering all faces of mini-cubes, there will be totally 24 faces painted in 6 different colors (Indexed from 0), and there will be exactly 4 faces painted in each kind of color. If 4 mini-cubes' faces of same color rely on same large cube face, we can call the large cube face as a completed face.

   

Now giving you an color arrangement of all 24 faces from a scrambled Pocket Cube, please tell us the maximum possible number of completed faces in no more than N twist steps.

Index of each face is shown as below:

Input

There will be several test cases. In each test case, there will be 2 lines. One integer N (1 ≤ N ≤ 7) in the first line, then 24 integers Ci seperated by a sinle space in the second line. For index 0 ≤ i < 24, Ci is color of the corresponding face. We guarantee that the color arrangement is a valid state which can be achieved by doing a finite number of twist steps from an initial cube whose all 6 large cube faces are completed faces.

Output

For each test case, please output the maximum number of completed faces during no more than N twist step(s).

Sample Input
1
0 0 0 0 1 1 2 2 3 3 1 1 2 2 3 3 4 4 4 4 5 5 5 5
1
0 4 0 4 1 1 2 5 3 3 1 1 2 5 3 3 4 0 4 0 5 2 5 2
Sample Output
6
2

题意:给一个初始状态的2*2*2魔方,求在n步内最多能完成几面

#include<iostream>
#include<cstdio>
using namespace std;

int ans;
int c[6][24]={{6,1,12,3,5,11,16,7,8,9,4,10,18,13,14,15,20,17,22,19,0,21,2,23},
              {20,1,22,3,10,4,0,7,8,9,11,5,2,13,14,15,6,17,12,19,16,21,18,23},
			  {2,0,3,1,6,7,8,9,23,22,10,11,12,13,14,15,16,17,18,19,20,21,5,4},
			  {1,3,0,2,23,22,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,9,8},
			  {0,1,8,14,4,3,7,13,17,9,10,2,6,12,16,15,5,11,18,19,20,21,22,23},
			  {0,1,11,5,4,16,12,6,2,9,10,17,13,7,3,15,14,8,18,19,20,21,22,23}
			  };

void check(int *a)
{
	int cnt=0;
	if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]) cnt++;
	if(a[4]==a[5]&&a[5]==a[10]&&a[10]==a[11]) cnt++;
	if(a[6]==a[7]&&a[7]==a[12]&&a[12]==a[13]) cnt++;
	if(a[8]==a[9]&&a[9]==a[14]&&a[14]==a[15]) cnt++;
	if(a[16]==a[17]&&a[17]==a[18]&&a[18]==a[19]) cnt++;
	if(a[20]==a[21]&&a[21]==a[22]&&a[22]==a[23]) cnt++;
	if(cnt>ans) ans=cnt;
}

void dfs(int *a,int d)
{
	int b[24];
	check(a);
	if(d==0||ans==6) return;
	for(int i=0;i<6;i++)
	{
		for(int j=0;j<24;j++)
		{
			b[j]=a[c[i][j]];
		}
		dfs(b,d-1);
	}
}

int main()
{
	int i,n,a[24];
	while(scanf("%d",&n)!=EOF)
	{
		ans=0;
		for(i=0;i<24;i++) scanf("%d",&a[i]);
		dfs(a,n);
		printf("%d\n",ans);
	}
	return 0;
}

思路:暴力

注意:旋转的方式有6种,递归的数组不能放在函数外


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值