算法题:立方体是否匹配(C)

问题:有这样的一个目标立方体,每个面都有一个数字,上、前、右、下、后和左六个面上的数字分别是1、2、3、4、5和6。现在有一个测试立方体,其六个面上也有1、2、3、4、5和6这个数字。现在想通过一个算法告知:测试立方体是否与目标立方体匹配?这里匹配的意思是指:若可以通过旋转测试立方体使得其上、下、左、右、前和后六个面与目标立方体对应的面上的数字一致,则就称它们是匹配的。

目标立方体

 

 

注:这个问题来自于一家公司的笔试题。原题并不是这样子表达的。原题并不是数字,而是颜色。这里要求六个面的数字是不同的,而原题中六个面的颜色是可以相同的。对于这个问题的 C 程序如下:

#include<stdio.h>

#define MATCH(a,b,c) ((a+1-b)%3==0 && (b+1-c)%3==0)

struct cube {
	int up;
	int down;
	int front;
	int back;
	int right;
	int left;
};
struct cube targetcube = {1, 4, 2, 5, 3, 6};

int cubematch(struct cube testcube);

int main()
{
	struct cube testcube;
	printf("Please enter: 1  2  3  4  5  6  in any order, which is respectively assigned to: up down front back right left:\n");
	scanf("%d %d %d %d %d %d", &testcube.up, &testcube.down, &testcube.front, &testcube.back, &testcube.right, &testcube.left);
	printf("The test cube and target cube are%smatching.\n", cubematch(testcube) ? " " : " not ");
	
	return 0;
}

//若测试立方体与目标立方体匹配则返回 1,否则返回 0。
int cubematch(struct cube test)
{
	if ((test.up-test.down)%3 == 0 && (test.front-test.back)%3 == 0)
		if (test.up <= 3){
			if (test.front <= 3) {
				if (test.right == 6-test.up-test.front && MATCH(test.up,test.front,test.right))
					return 1;
				if (test.left == 6-test.up-test.front && MATCH(test.up,test.left,test.front))
					return 1;
			} else {
				if (test.right == 6-test.up-test.back && MATCH(test.up,test.right,test.back))
					return 1;
				if (test.left == 6-test.up-test.back && MATCH(test.up,test.back,test.left))
					return 1;
			}
		} else if ( test.front <= 3 ) {
			if (test.right == 6-test.down-test.front && MATCH(test.down,test.right,test.front))
				return 1;
			if (test.left == 6-test.down-test.front && MATCH(test.down,test.front,test.left))
				return 1;
		} else {
			if (test.right == 6-test.down-test.back && MATCH(test.down,test.back,test.right))
				return 1;
			if (test.left == 6-test.down-test.back && MATCH(test.down,test.left,test.back))
				return 1;
		}

	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值