问题 问答题

【函数】
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[i][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[i][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[i][j+k]==0”可知j起列号计数作用。因此,空(1)处应对

j赋初值0,空(2)处的条件应保证元素a[i][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++”。

单项选择题 A1/A2型题
选择题