筆試的一道題目,筆試的時候還是差一點,但是大體思路是正確的:
1.根據輸入的行與列確定該矩陣由多少個矩形組成矩形層數level=( n>m? n:m)/2得出。
2.每一層矩形,按順時針方向設置組成矩形的值
3.打印
重點:1.動態定義數組
[plain]
<pre name="code" class="plain">//開辟內存空間動態建立二維數組。
matrix=(int **)calloc(n,sizeof(int *));
for(i=0;i<n;i++)
{
matrix[i]=(int *)calloc(m,sizeof(int));
}</pre><br>
2.當前層數包含的值的范圍以及矩形四條邊包含的值的范圍的劃分。
[plain]
rectLength=(m-i*2);
rectWidth=(n-i*2);
right=rectLength+rectWidth-1;
bottom=rectLength+rectWidth-1+rectLength-2;
left=(rectLength+rectWidth-2)*2;
[plain] view plaincopy
#include<stdlib.h>
void show(int m,int n) //m =chang n=kuang
{
int **matrix;
int i,j;//i為當前層,j為當前矩形的當前位置
int rectLength,rectWidth;//矩形的長和寬
int level;
int sum=0;
int topL,rightL,bottomL,leftL,right,bottom,left;
if(!n || !m)
return ;
//開辟內存空間動態建立二維數組。
matrix=(int **)calloc(n,sizeof(int *));
for(i=0;i<n;i++)
{
matrix[i]=(int *)calloc(m,sizeof(int));
}
level=n>m ?n:m;
level=level/2; //矩形層數
sum=1;
for(i=0;i<=level;i++) //修改每一層矩形的內容
{
rectLength=(m-i*2);
rectWidth=(n-i*2);
right=rectLength+rectWidth-1;
bottom=rectLength+rectWidth-1+rectLength-2;
left=(rectLength+rectWidth-2)*2;
for(j=1;j<= left;j++) //
{
if(j<=rectLength) //上邊
{
matrix[i][j-1+i]=sum++;
continue;
}
else if(j > rectLength && j<=right) //右邊
{
matrix[j-rectLength+i][m-i-1]=sum++;
continue;
}
else if( j >right && j<= bottom) //下邊
{
matrix[n-i-1][bottom-j+1+i]=sum++;
continue;
}
else if( j > bottom && j<= left ) //左邊
{
matrix[left-j+1+i][i] =sum++;
continue;
}
if(sum > n*m -1)
break;
}
}
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<m;j++)
printf("%4d",matrix[i][j]);
}
printf("\n");
}
void main()
{
int i,j;
printf("please input length and width ");
scanf("%d %d",&i,&j);
show(i,j);
}