天天看点

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

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

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

注:这个问题来自于一家公司的笔试题。原题并不是这样子表达的。原题并不是数字,而是颜色。这里要求六个面的数字是不同的,而原题中六个面的颜色是可以相同的。对于这个问题的 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;
}
           

继续阅读