如何实现给定一个自然数大小,输出如下矩阵格式内容?

sweird 2011-08-11 05:59:23
给定任意自然数大小,比如给定int n = 4;
输出:(n * n 大小矩阵, 规律如下)

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7


刚看到这题目时,我只觉得外面一圈的值是很容易定下来的,但里面的值呢?给定不同的n怎么进行控制呢?

...全文
612 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT-学徒 2011-08-14
  • 打赏
  • 举报
回复
好好研究下。
sweird 2011-08-11
  • 打赏
  • 举报
回复
感谢二位给出答案,好好研究下。

这个是昨天的面试题。
sweird 2011-08-11
  • 打赏
  • 举报
回复
感谢二们给出答案,好好研究下。

这个是昨天的面试题。
liutengfeigo 2011-08-11
  • 打赏
  • 举报
回复
蛇形矩阵.
lykakaxi 2011-08-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#define M 50

void main()
{
int i,j,n,count;
int dada[M][M] = {0};
printf("Input n(0~%d):",M);
scanf("%d",&n);
count = 1;
for(i=0;i<(n+1)/2;i++)
{
for (j=i;j<n-i;j++)
{
dada[i][j] = count++;
}
for (j=i+1;j<n-i;j++)
{
dada[j][n-i-1] = count++;
}
for (j=n-i-2;j>=i;j--)
{
dada[n-i-1][j] = count++;
}
for (j=n-i-2;j>i;j--)
{
dada[j][i] = count++;
}
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("%5d",dada[i][j]);
}
printf("\n\n");
}
}

tanggaochao 2011-08-11
  • 打赏
  • 举报
回复
for循环嵌套,应该可以实现
zhusizhi007 2011-08-11
  • 打赏
  • 举报
回复
只要找到规律,代码还是很精练的,学习了。。。。
icemornings 2011-08-11
  • 打赏
  • 举报
回复
改进一下代码:

#include <stdio.h>

int main(int argc, char **argv)
{
/* 矩阵(外面加一层墙) */
enum {N = 6};
int matrix[N + 2][N + 2] = {0};
/* 当前位置的四个方向的偏移 */
enum {RIGHT, DOWN, LEFT, UP};
int off_x[4] = {1, 0, -1, 0};
int off_y[4] = {0, +1, 0, -1};

/* 当前位置(初始化为第一个点的左边) */
int x = 0, y = 1;
/* 方向初始化为向右 */
int direct = RIGHT;

int i, k;

/* 初始化外围的墙 */
for (i = 0; i < N + 2; ++i)
{
matrix[0][i] = 1;
matrix[N + 1][i] = 1;
matrix[i][0] = 1;
matrix[i][N + 1] = 1;
}

/* 开始填充 */
for (i = 0; i < N * N; ++i)
{
x += off_x[direct];
y += off_y[direct];
matrix[y][x] = i + 1;

/* 这个方向已经走不通的时候设置下一个方向(有墙的好处是不用判断是否越界了) */
if (0 != matrix[y + off_y[direct]][x + off_x[direct]])
{
direct = (direct + 1) % 4;
}
}

/* 打印 */
for (i = 0; i < N; ++i)
{
for (k = 0; k < N; ++k)
printf("%d\t", matrix[i + 1][k + 1]);
putchar('\n');
}
return 0;
}
/*
N = 6时候的输出:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
*/

[Quote=引用 1 楼 icemornings 的回复:]

丢一段代码,注释已经很详细了:
C/C++ code

#include <stdio.h>

int main(int argc, char **argv)
{
/* 矩阵 */
enum {N = 4};
int matrix[N][N] = {0};

/* 当前位置的四个方向的偏移 */
enum {RIGHT, DOWN, LEFT, UP}……
[/Quote]
icemornings 2011-08-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icemornings 的回复:]

丢一段代码,注释已经很详细了:
C/C++ code

#include <stdio.h>

附上,N = 5时候的输出:

/*
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
*/

int main(int argc, char **argv)
{
/* 矩阵 */
enum {N = 4};
int matrix[N][N] = {0};

/* 当前位置的四个方向的偏移 */
enum {RIGHT, DOWN, LEFT, UP}……
[/Quote]
icemornings 2011-08-11
  • 打赏
  • 举报
回复
丢一段代码,注释已经很详细了:

#include <stdio.h>

int main(int argc, char **argv)
{
/* 矩阵 */
enum {N = 4};
int matrix[N][N] = {0};

/* 当前位置的四个方向的偏移 */
enum {RIGHT, DOWN, LEFT, UP};
int off_x[4] = {1, 0, -1, 0};
int off_y[4] = {0, +1, 0, -1};

/* 当前位置(初始化为第一个点的左边) */
int x = -1, y = 0;
/* 方向初始化为向右 */
int direct = RIGHT;

int i, k;

/* 开始填充 */
for (i = 0; i < N * N; ++i)
{
x += off_x[direct];
y += off_y[direct];
matrix[y][x] = i + 1;

/* 这个方向已经走不通的时候设置下一个方向 */
if (x + off_x[direct] < 0 || x + off_x[direct] >= N ||
y + off_y[direct] < 0 || y + off_y[direct] >= N ||
0 != matrix[y + off_y[direct]][x + off_x[direct]])
{
direct = (direct + 1) % 4;
}
}

/* 打印 */
for (i = 0; i < N; ++i)
{
for (k = 0; k < N; ++k)
printf("%d\t", matrix[i][k]);
putchar('\n');
}
return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧