编程爱好者 论坛上某个网友出的,原帖如下:
请大家帮我仔细的提示一下这个回路的题目怎么做?怎样打出如下图案:
1 2 3 4 5 6
14 15 16 17 18 7
13 12 11 10 9 8
解题思路:很容易的我们发现这个数阵很有规律,假如我们有一个二维数组
a[i][j],如果我们能把这些数按上面那样填进数组输出就不成问
题了,我们发现第一行依次向右增加(从1开始),我们设个变量k
首先设 k = 1,k按1增长填进数组,数组下标的规律是首先 j++;然后
方向 变为向下即 i ++; 之后方向向左,即 i --, j --;随后向上即
i --;最后又回到出发的方向,向右 ^_^.如果填数的过程中我们知道
什么时候该向哪个方向走就好了,为了实现这个目的,我们可以将数组
初始化为 0 ,并且在外围增加一层墙(设值为 1),遇到墙我们就回退
因为我们知道方向变化的规律,我们按这个规律,遇到值为 0 的我们就
把 k 填进去,并且增大 k 值以填下一个位置 。这里还要适当的将 i,j
做些变化,方法就是这样,下面是我写的,用到了动态数组
最近忙于软考,时间不多,这个也是受LZ所托才写的,发了大半个小时,感觉挺有
意思就收到BLOG上了 !
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
/* 在外围砌一层墙 */
void InitMatrix(int r,int c,int *pMatrix){
int i;
for(i = 0; i <= c; i ++)
*(pMatrix+(r-1)*c+i) = *(pMatrix+i) = 1;
for(i = 0; i <= r; i ++)
*(pMatrix+i*c) = *(pMatrix+c*(i+1)-1) = 1;
}
/* 填数据 */
void SetDate(int r,int c,int *pMatrix){
int k = 1, i = 0, j = 0;
int max = (c-2)*(r-2);
while(k <= max){
for(i ++,j ++; !*(pMatrix + i*c + j); j ++)
*(pMatrix + i*c + j) = k++;
for(j--,i++; !*(pMatrix + i*c + j); i ++)
*(pMatrix + i*c + j) = k++;
for(i--,j--; !*(pMatrix + i*c + j); j --)
*(pMatrix + i*c + j) = k++;
for(j++,i--; !*(pMatrix + i*c + j); i --)
*(pMatrix + i*c + j) = k++;
}
}
/* 打印结果 */
void PrintDate(int r,int c,int *pMatrix){
int i,j;
for(i = 1; i <= r-2; i ++){
for(j = 1; j <= c-2; j ++)
printf("%-4d ",*(pMatrix + i*c + j));
printf("\n");
}
}
/* 主函数 */
int main(){
int *pMatrix;
int r,c;
printf("Enter row and column:");
scanf("%d%d",&r,&c);
pMatrix = (int*)malloc((r+2)*(c+2)*sizeof(int));
if(!pMatrix){
printf("Alloc memory failed!\n");
return 1;
}
r += 2;
c += 2;
memset(pMatrix,0,r*c*sizeof(int));
InitMatrix(r,c,pMatrix);
SetDate(r,c,pMatrix);
PrintDate(r,c,pMatrix);
system("pause");
return 0;
}
Enter row and column:10 13
1 2 3 4 5 6 7 8 9 10 11 12 13
42 43 44 45 46 47 48 49 50 51 52 53 14
41 76 77 78 79 80 81 82 83 84 85 54 15
40 75 102 103 104 105 106 107 108 109 86 55 16
39 74 101 120 121 122 123 124 125 110 87 56 17
38 73 100 119 130 129 128 127 126 111 88 57 18
37 72 99 118 117 116 115 114 113 112 89 58 19
36 71 98 97 96 95 94 93 92 91 90 59 20
35 70 69 68 67 66 65 64 63 62 61 60 21
34 33 32 31 30 29 28 27 26 25 24 23 22
请按任意键继续. . .
评论