2.三角形划分平面区域(tripar.cpp)
1 个三角形将平面划分成内、外2个区域。2个三角形最多将平面划分成 8个区域,如下图所示。
给定三角形数量 n,求 n 个三角形最多将平面划分成多少个区域。
Input
第1行:1个整数 n(0<=n<=100)
Output
第1行:1个整数,表示最多划分的平面区域数量
Sample Input
3
Sample Output
20
解析 :
本题的核心是递归式,只要把递归式弄懂,此题可解。
当然在完成此题的同时,我们也需要注意信息和数学还是有差别的,我们不能把幼稚的数学题,拿到信息上来。
如下面这位同学的代码:
*哥来帮忙:
#include<iostream>
#include<cstring>
#include<cstdio>
int abc(int n)
{
int m=1;
int x=2*2+4;//What is this?
if(n==0) printf("0\n");
else if(n==1) printf("2\n");
else
{
for(int i=1;i<=n-2;i++)
{
x=x*2+4;//递推式错误
}
printf("%d\n",x);
}
}
int main()
{
int n;
scanf("%d",&n);
abc(n);
}
如此看来,递推式还是要高于找规律。
递推(AC):
#include<cstdio>
long long a[200]={0,2};
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
a[i]=a[i-1]+6*(i-1);//递归式
printf("%lld",a[n]);
}
我的方法:
#include<iostream>
#include<cstring>
#include<cstdio>
int abc(int n)
{
if(n == 1) return 2;//根据样例得出
int m=abc(n-1);//递归
return m+6*(n-1);//递归式(核心)
/*
类似于直线划分平面
考虑第n个三角形,它的每条边最多与前n-1个三角形的每2条边相交,
因此第n个三角形与前n-1个三角形共形成2*(n-1)*3个交点。(两个顶点,三条边)
这些交点把第n个三角形分割成6*(n-1)个线段。
其中每条线段都把原来的区域一分为二,即新增6*(n-1)个区域。
因此有递归式:
f(n) = f(n-1) + 6*(n-1)
f(1) = 2
*/
}
int main()
{
int n;
scanf("%d",&n);//输入
printf("%d",abc(n));//输出
}
终极解析:
#include<cstdio>
int main()
{
int n;
scanf("%d",&n);
//特殊处理
if(n==0) {printf("1\n");return 0;} //没有三角形
if(n==1) {printf("2\n");return 0;} //没有角
if(n==2) {printf("8\n");return 0;} //没有其他(中心与角之间)
int ans=0;
ans+=n*3;//角(四周的顶点)
ans++;//中心(中心位置一定只有一个)
ans+=3*n*(n-2); //其他(中心与角之间方块)
ans++; //外部方块
printf("%d\n",ans);
return 0;
}
//如有疑惑的同学,可以看一下示意图。