题目:
Problem Description
用N个三角形最多可以把平面分成几个区域?
Input
输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只包含一个正整数N(1<=N<=10000).
Output
对于每组测试数据,请输出题目中要求的结果.
Sample Input
2 1 2
Sample Output
2 8
有一种很简单的理解方法,就是画一个圆,用两个三角形举例来说,3表示3条边,1表示第二个三角形的每一条边都会与第一个三角形的其中两条边相交后得到一个三角形,2表示2个三角形,+2则表示外面的区域和同有的2个三角形共有的一个区域。同样第三个三角形会与第一第二个三角形都有两条边相交。可得:3*2*3+2
由些可得,n个三角形:3*(n-1)*n+2
此种代码如下:
还有可以直接用欧拉公式,不论什么形状的凸多边形 ,其顶点数V、棱数E、面数F之间总有关系V+F-E=2,则F = E - V + 2;
此种代码如下:
#include <stdio.h>
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",3 * (n-1) * n + 2);
//3表示有三角形有三条边,n表示n个三角形,(n-1)表示吗,每个三角形都会与其他(n-1)个三角形的其他两条边构成一个三角形,n表示
//有n个三角形,再加二表示内部重合部分和外部
}
return 0;
}
还有可以直接用欧拉公式,不论什么形状的凸多边形 ,其顶点数V、棱数E、面数F之间总有关系V+F-E=2,则F = E - V + 2;
边:E[i]=E[i-1]+(4*i-3)*3;
点:V[i]=V[i-1]+(2*i-1)*3;
此种代码如下: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 10001
int V[max],E[max];
void solve()
{
int i;
memset(V,0,sizeof(V));
memset(E,0,sizeof(E));
E[1]=V[1]=3;
for(i=2;i<max;i++)
E[i]=E[i-1]+(4*i-3)*3;
for(i=2;i<max;i++)
V[i]=V[i-1]+(2*i-1)*3;
}
int main()
{
int T,n;
solve();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",E[n]-V[n]+2);
}
return 0;
}