编程爱好者 论坛上某个网友出的,原帖如下: 请大家帮我仔细的提示一下这个回路的题目怎么做?怎样打出如下图案:1 2 3 4 5 614 15 16 17 18 713 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 131 2 3 4 5 6 7 8 9 10 11 12 1342 43 44 45 46 47 48 49 50 51 52 53 1441 76 77 78 79 80 81 82 83 84 85 54 1540 75 102 103 104 105 106 107 108 109 86 55 1639 74 101 120 121 122 123 124 125 110 87 56 1738 73 100 119 130 129 128 127 126 111 88 57 1837 72 99 118 117 116 115 114 113 112 89 58 1936 71 98 97 96 95 94 93 92 91 90 59 2035 70 69 68 67 66 65 64 63 62 61 60 2134 33 32 31 30 29 28 27 26 25 24 23 22请按任意键继续. . .

评论