- 5
- 0
- 约5.16千字
- 约 7页
- 2016-12-03 发布于重庆
- 举报
exercise1ACM
第一次作业
1、平面分割方法
设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
输入示例:
3
输出示例:
8
要求:
用两种方法:
得到第n项与其之前已知项之间的关系,程序用递归实现
得到第n项的通项公式,程序直接实现。
解:
每增加一条封闭曲线该曲线就会与之前的每条曲线产生两个交点,所以会增加2(n-1)个交点。
递归关系:f(n)=f(n-1)+2(n-1)(增加几个交点就增加几个平面),f(1)=2
通项公式:f(n)=n(n-1)+2
//(1)
//平面分割方法
int countArea(int n)//递归法
{
if(n==1)
return 2;
else
return countArea(n-1)+2*(n-1);
}
//通项公式法an=2+n(n-1)
int countArea2(int n)
{
return 2+n*(n-1);
}
2、LELE的RPG难题
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
输入示例:3
输出示例:6
解:递归分析:从f(n-1)增加到f(n)分两种情况:(1)一种是直接在所有已经排好了的f(n-1)序列中插入唯一一个第三色有f(n-1)种;(2)另外是在已经排好了的f(n-2)序列中,插入与缝隙两边其中一个颜色相同的颜色,然后再插入第n个颜色且只需与第n-1种颜色不同有两种,故有2f(n-2)种;
递归关系:f(n)=f(n-1)+2f(n-2),(n=2)
//(2)LELE的RPG难题
int countColor(int n)
{
if(n==2)
return 6;
else if(n==3)
return 6;
else
return countColor(n-1)+2*countColor(n-2);
}
假设一个有序数组A[0], A[1], …, A[N-1],编写一个函数int find(int A[], int x),确定一个整数x是否在数组A中,如果在,则返回其位置,否则返回-1
//有序数组元素查找-二分查找
int find(int A[],int n)
{//sizeof(A)sizeof写进函数得不到数组所占的内存数,而仅是一个指针的内存大小
int length=0;//参数数组长度
for(int i=0;A[i]!=0;i++)
{
length++;
}
int left=0,mid,right=length-1;
while(left=right)
{
mid=(left+right)/2;
if(nA[mid])
right=mid-1;
else if(nA[mid])
{
left=mid+1;
}
else
return mid;
}
return -1;}
4、假设数组a中的元素是按从小到大顺序排列的,函数find(int a[], int n, int i, int j, int x)利用二分搜索法确定x是否在含有n个元素的数组a中,如果不在,则参数i为小于x的最大元素的下标,参数j为大于x的最小元素的下标。如果x在数组a中,则i与j相等,都为等于x的元素的下标。
//(4)二分查找定位
void find2(int a[],int n,int i,int j,int x)
{
int left=0,mid,right=n-1;
while(left=right)
{
mid=(left+right)/2;
if(xa[mid])
left=mid+1;
else if(xa[mid])
right=mid-1;
else
{
//找到了
i=j=mid;
return;
}
}
//没找到
i=right;
j=left;
}
5、百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,公鸡三块钱一只,母鸡两块钱一个,小鸡一块钱三只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?
//(5)百鸡问题-枚举法
void countChicken()
{
int i,j;double k;//公鸡、母鸡、小鸡
for(i=0;i=33;i++)
for(j=0;j=50;j++)
for(k=0;k=300;k++)
if(3*i+2*j+k/
原创力文档

文档评论(0)