HDU 1220

题目链接:Cube


大意:将边长为 n 的正方体分割成 1 * 1 * 1  的正方体,问有多少对正方体,他们之间有不超过 2 个公共的点。。。

正推的话感觉难度不小。。。

因为任意两个正方体,他们之间可能有 0 1 2 4 个共同的点;

所以我们可以想到“正难则反”

边长为 n 的正方体,可以分割成 n*n*n 个 1*1*1 的正方体,从中任取两个 即为 n*(n-1)/2

下面计算两个正方体之间有四个点的情况:

1) 正方体和周围 3 个正方体相邻,这种情况共有 8 个 ,求得个数为 3 * 8

2)正方体和周围 4 个正方体相邻,这种情况共有 (n-2)*12 个 ,求得个数为 4 * (n-2)*12

3)正方体和周围 5 个正方体相邻,这种情况共有 6*(n*n - 4 * n + 4)个,求得的个数为 5 * 6 * (n*n - 4 * n + 4)

4)正方体和周围 6 个正方体相邻,这种情况共有(n*n*n - n*n*6+n*12-8)个,求得的个数为6 * (n*n*n - n*n*6+n*12-8)

最后将所求的两个正方体之间有四个点的情况 ÷2  即可(比如 2 选 3 和 3 选 2 造成的重复

两者做差即可!

边长为 1 时进行一下特判!!!

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n == 1)
		{
			printf("0\n");
			continue;
		}
		long long anssum = n*n*n*(n*n*n-1)/2;
		int edge3 = 8;
		int ans3 = 3 * edge3;
		
		int edge4 = (n-2)*12;
		int ans4 = 4 * edge4;
		
		int edge5 = n*n - 4 * n + 4;
		int ans5 = 5 * 6*edge5;
		
		int edge6 = n*n*n - n*n*6+n*12-8;
		int ans6 = 6 * edge6;
		long long ans = anssum - (ans3 + ans4 + ans5 + ans6)/2;
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lizhiwei2017/article/details/80528861