exercise1ACM.docVIP

  • 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)

1亿VIP精品文档

相关文档