这是
线上风朋友做的恒生的笔试题~也是他提点了我一下。昨晚失眠,不过失眠的好啊,我睡到1点的时候想出来怎么做了,赶紧写在草稿本上...哈哈~
题目是这样的:
N*N的棋盘,N=5,让你打印输出如下,你可以构造一个A[N][N]的数组,然后填入结果后,打印出来。
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
规律:
当N=5:则下4,右4,上4,左4;再下2,右2,上2,左2. 最后填入最后一个数,完成
当N=6:则下4,右5,上5,左5;再下3,右3,上3,左3;再下1,右1,上1,左1;完成
代码
#include <stdio.h>
/* 可修改为你想输出的N */
#define N 5
int main()
{
int A[N][N];
int i,j,key=1,t;
int count;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
A[i][j]=0;
i=0;
j=0;
for(count=N-1;count>0;count-=2) /* 需要进行 N/2 轮 */
{
for(t=0;t<count;t++)
A[i++][j]=key++; /* 向下 i递增 */
for(t=0;t<count;t++)
A[i][j++]=key++; /* 向右 j递增 */
for(t=0;t<count;t++)
A[i--][j]=key++; /* 向上 i递减 */
for(t=0;t<count;t++)
A[i][j--]=key++; /* 向左 j递减 */
i++; /* 此时i和j指向这一轮的首元素,调整过来 */
j++;
}
if(count == 0) /* 当count=-1时,数组已经排好,当=0时需要补上最后一个数 */
A[N/2][N/2]=key;
for(i=0;i<N;i++) /* 输出 */
{
for(j=0;j<N;j++)
printf("%2d ",A[i][j]);
printf("\n");
}
return 0;
}
|
阅读(1830) | 评论(0) | 转发(0) |