阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[i][j]圆等于0表示 第i排第j列(0≤i,j≤

admin2008-01-03  22

问题 阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
   假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[j]圆等于0表示

第i排第j列(0≤i,j≤N-1)的票尚未售出。
   函数int Find(int a[][N],int R,int*row,int*col)的功能是:在部分票已售出的情况下,找出剧场中的R*R个空座位,要求这些座位

的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回1,并算出该正方形左上角的行、列号;若未找到,则返回0。
   例如,一个7X7个座位的剧场如下图(a)所示,已售出部分座位的剧场如下图(b)所示,图中阴影部分表示已售出的座位,从下图(b)中找出
的3X3正方形空座位如下图(c)中斜线区所示。
  
【函数】
   int Find(int a[][N] int R,int*row,iht*col)
   {int i,j,k,c,t;int FOUND=0;
     for(i=0;!FOUND&&i<N-R+1;i++)  {    /*从第0排开始查找*/
        (1);
       while  (j<N-R+1&&!FOUND)  {
         for (k=0;(2)&&a[j+k]==0;k++);    /*查找第i排连续的R个空座位*/
         if  (k>=R)  {    /*找到第i排连续的R个空座位*/
           for (c=0;c<R;c++)  {    /*查找其余的R*(R-1)个座位*/
             for (t=1;t<R;t++)
               if (a[(3)][j+c]!=0) break;
             if (t<R)  break;
            }/*for*/
            if ((4))  FOUND=1;
          }/*if*/
           (5;
         }/*while*/
       }/*fori*/
       if (FOUND)  {
         *row=i-1;  *col=j-1;    /*计算正方形区域的左上角坐标*/
        return 1;
      }
      return 0;
   }

选项

答案(1)j=0 (2)k<R,及其等价形式 (3)i+t (4)c>=R,及其等价形式 (5)j++,或++j,或j+=1,或j=j+1

解析 首先将函数代码加上行号,以便说明。
   1:int Find (int a[][N],int R,int*row,int*col)
   2:{int i,j,k,c,t;  int FOUND=0;
   3:    for (i=0;!FOUND &&i<N-R+1;i++)  {    /*从第0排开始查找*/
   4:  (1)  ;
   5:    while (j<N-R+I&&!FOUND)  {
   6:     for(k=0;  (2)  &&a[j+k]=0;k++);/*查找第i排连续的R个空座位*/.
   7:      if  (k>=R)  {    /*找到第i排连续的R个空座位*/
   8:       for (c=0;c<R;c++)  {    /*查找其余的R*(R-1)个座位*/
   9:         for (t=1;t<R;t++)
   10:          if (a[  (3)  ][j+c]!=0)  break;
   11:        if  (t<R)  break;
   12:        }/*for*/
   13:      if (  (4)  ) FOUND=1
   14:    )/*if*/
   15:     (5)  ;
   16:    }/*while*/
   17:  )/*fori*/
   18c  if (FOUND)  {
   19:    *row=i-1;  *col=j-1;    /*计算正力形区域的左上角坐标*/
   20:     return 1
   21:  }
   22:  return 0;
   23: }
   根据题目中的说明可知,函数Find()的计算过程就是在有标记的方阵中找出一个 R*R的尚未标记的子方阵。根据第3行的代码及注释“从第

0排开始查找”,可知i起行号计数作用。
   在确定的起始行上,显然是从左到右找到一个空座位(即标记为0的矩阵元素),然后考查是否存在连续的R个空座位,若不存在,本行不再

作为起始行,否则应考查与本行的连续R个空座位同列的下一行空座位情况,且从“a[j+k]==0”可知j起列号计数作用。因此,空(1)处应对

j赋初值0,空(2)处的条件应保证元素a[j+k]的下标有效,即j+k<N,又知j<=N-R,所以空(2)处应填入“k<R”。
   显然,一旦确定了第i行的R个空座位,随后就应考查第i+1行~第i+R-1行上的座位情况,这部分功能是由第8行~第12行代码来实现的。由

于循环变量c的变化范围是0~R-1,t的变化范围是1~R-1,而且以j+c作为列下标,因此空(3).处的行下标应该为“i+t”。第11行代码表示的

是循环for(c:0=;c<R;c++)的中断处理,显然若该循环能在c==R时结束,则说明找到了R*R子方阵,因此空(4)处填入“c=R”。起列号计数

作用的j在条件为“j<N-R+1”的while循环中还需要有改变值的语句,因此空(5)处应填入“j++”。
转载请注明原文地址:https://kaotiyun.com/show/dzjZ777K
0

最新回复(0)