【八中】三角形划分平面区域(tripar.cpp)

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;
}
//如有疑惑的同学,可以看一下示意图。

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值