折线分割平面算法
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
===================================================================
思考:
看到这个问题想了很久,刚开始想用笨办法,一个一个的求出来再找规律,但算到第五个折线就放弃了,因为图画的太乱了,几乎数不清了,就数字来说也找不出什么规律,所以行不通就放弃了,总感觉有巧办法,找来找去,在纸上画来画去,终于发现了其中的玄机。
每个折线都可以把它看成是两条直线相交,而两者的区别在于每多一个折角,都会少两个区域,这里为什么是两个区域,自己画图一看就明白了,所以,一条折线可以看成两条直线相交所分割的区域减2,两条折线可以看成是四条直线所分割的区域减4,三条折线可以看成是四条直线所分割的区域减6,,,规律就是这样。而要找到n条直线相交最多可以划分多少个区域的问题就简单多了。
代码:
#include<stdio.h>
int main()
{
int C;
int str1[20001];
int str2[10001];
str1[0]=1;
str2[0]=1;
for(int i=1;i<20001;i++) // n 条直线最多划分多少个区域
{str1[i]=str1[i-1]+i;
}
for(i=1;i<10001;i++) // n 条折线最多划分多少个区域
{
str2[i]=str1[i*2]-i*2;
}
while(scanf("%d",&C)!=EOF)
{
int n;
for(int i=0;i<C;i++)
{
scanf("%d",&n);
printf("%d\n",str2[n]);
}
}
return 0;
}
以上。