新人提问~

panlianges 2007-04-06 02:14:27
用for语句实现二维数组:

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

有代码的会最好。。。
非常感谢。。。
...全文
277 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongming1129 2007-04-07
  • 打赏
  • 举报
回复
楼主,你得找个机会,好好谢谢royt(小白鼠) 呀,他算是辛苦啦。
panlianges 2007-04-07
  • 打赏
  • 举报
回复
非常感谢。。。

不是偶小气。。。

是没有分数了。。。
loongee 2007-04-07
  • 打赏
  • 举报
回复
royt(小白鼠) 的程序代码用到了动态定义数组,在新标准的编译器里为什么能通过呢?
VC6是通不过的,书上也说数组是不允许动态定义大小的啊。

小弟不明,还望指点。
heiun 2007-04-07
  • 打赏
  • 举报
回复
好!太好了,太强了
royt 2007-04-07
  • 打赏
  • 举报
回复
royt(小白鼠) 的程序代码用到了动态定义数组,在新标准的编译器里为什么能通过呢?
VC6是通不过的,书上也说数组是不允许动态定义大小的啊。

小弟不明,还望指点。

------------------------------------------------------------------------------

vc6是98年的产品吧,遵守的是C89标准,而且即使是老的标准,各种编译器也不是100%的支持。例如for (int i=0; i<n; i++)这样的语句,标准是把i看成for里面的局部变量的,但是vc把i看成是for外面的int i定义的,在for后面也可以继续使用。目前最新的是C99标准,可以支持边长数组等特性,目前能够完全支持的编译器还不多,建议使用gcc 4或者vc2005作为编译器,它们对新标准提供了较好的支持。
幸福的小雨 2007-04-07
  • 打赏
  • 举报
回复
好强
zylian 2007-04-07
  • 打赏
  • 举报
回复
辛苦,顶
fohonet 2007-04-07
  • 打赏
  • 举报
回复
不好意思 ,呵呵

重新 发一个算法 :



main()
{int t=0,n,i,j,k,l1,l0,c1,c0;
int aa[20][20];
printf("请输入n阶方阵的阶数n:");
scanf("%d",&n);
i=l0=0,
l1=n-1,
j=c0=0,
c1=n-1;/*l0,l1分别表示左右边界,c0,c1分别表示上下边界*/
k=1;
for(k=1;k<=n*n;k++)
{aa[i][j]=k;
switch(t)
{case 0: /*t=0表示方阵的旋转方向为从左到右*/
j++;
if (j>c1) /*判断是否已超出右边界*/
{j--;i++;t++;l0++;}/*改变行列及t和左边界的值*/
break;
case 1: /*t=1表示方阵的旋转方向为从上到下*/
i++;
if (i>l1) /*判断是否已超出下边界*/
{i--;j--;t++;c1--;}
break;
case 2: /*t=2表示方阵的旋转方向为从右到左*/
j--;
if (j<c0) /*判断是否已超出左边界*/
{j++;i--;t++;l1--;}
break;
case 3: /*t=3表示方阵的旋转方向为从下到上*/
i--;
if (i<l0) /*判断是否已超出上边界*/
{i++;j++;t=0;c0++;}
break;
}
}
printf("所得的方阵是:\n");
for(i=0;i<n;i++)
{for (j=0;j<n;j++)
printf("%5d",aa[i][j]);
printf("\n");
}
getch();
}




royt 2007-04-06
  • 打赏
  • 举报
回复
不好意思,我的程序改动一下,将while(1)里面的第一句 int tmp = k; 放到while外面,改成tmp = k; tmp的定义请加到开始的 int i,j,k 后面。

另外就是有些C编译器要求变量的定义必需在main的开始处,否则无法编译通过,遇到这种情况请更改一下语句的秩序,将定义语句放最前面。
royt 2007-04-06
  • 打赏
  • 举报
回复
/*
* Author: Royt
* Date: Apr 6th, 2007
* Function: 将一个方阵从定点到中心用递增的整数填满
* Compiler: Dev-C++ 4.9.9.2(mingw)
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

// 判断索引是否超出方阵的边界
int InSquare(int x, int y, int n)
{
if ((x >= 0 && x < n) && (y >= 0 && y < n))
{
return 1;
}
else
{
return 0;
}
}

// 在控制台上输出方阵
void PrintSquare(int **s, int n)
{
int i, j;
printf("\n");

for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%2d ", *((int*)s + (n * i) + j));
}
printf("\n");
}
}

// 主函数
int main()
{
int N; // 方阵边长
printf("边长:");
scanf("%d", &N);

int i, j, k;
int square[N][N]; // 定义方阵
int count = 1; // 计数变量,没填写一个方格count值加1

/*
* 该结构体定义了位置沿着不同方向变化时索引的改变
* 如向左移动时,方阵的行索引减1,列索引不变
*/
struct _direction {
int horizontal;
int vertical;
} dct, direction[4]; // dct记录当前的移动方向

direction[0].vertical = -1; direction[0].horizontal = 0; // up
direction[1].vertical = 1; direction[1].horizontal = 0; // down
direction[2].vertical = 0; direction[2].horizontal = -1; // left
direction[3].vertical = 0; direction[3].horizontal = 1; // right

// 初始化square方阵,每一个值均为0
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
square[i][j] = 0;
}
}

i = 0; j = 0; // i和j表示起始位置,这里表示从第一行第一列开始
square[i][j] = 1;
k = 3; // k代表方向,例如当k==3时direction[k]表示移动方向为右
dct = direction[k];

// 在方阵中寻找路径
while (1)
{
int tmp = k; // tmp记录当前的移动方向

/*
* 每当进行下一步移动之前,先判断继续沿当前方向的一下个位置是否合法
* 包括:1.下一步是否会超出边界;2.下一步是否已经路过,即值是否非0
* 如果下一步可用,则退出循环继续沿此方向前进,若不可用则改变方向
* 用tmp记录当前方向,通过++k%4将尝试其它方向是否下一步可行
* 若最后k==tmp则说明四个方向都已顺次尝试,无路可通,于是程序结束
*/
while (! (InSquare(i + dct.vertical, j + dct.horizontal, N)
&& (square[i + dct.vertical][j + dct.horizontal] == 0)))
{
k = ++k % 4;
dct = direction[k];
if (k == tmp)
{
PrintSquare((int **)square, N); // 输出方阵
printf("\n%d个方块绘制完毕!\n", count);
getch();
return 0;
}
}

tmp = k; // 记录当前移动方向
// 使用三条语句填写下一个值
i += dct.vertical;
j += dct.horizontal;
square[i][j] = ++count;
}

return 0;
}

// 输出结果示范
/*
边长: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

25个方块绘制完毕
*/

// 可以修改源文件中i,j,k的值,如i=8(最边沿),j=0,k=0(向上),输出如下
/*
边长:9

9 10 11 12 13 14 15 16 17
8 39 40 41 42 43 44 45 18
7 38 61 62 63 64 65 46 19
6 37 60 75 76 77 66 47 20
5 36 59 74 81 78 67 48 21
4 35 58 73 80 79 68 49 22
3 34 57 72 71 70 69 50 23
2 33 56 55 54 53 52 51 24
1 32 31 30 29 28 27 26 25

81个方块绘制完毕!
*/

// 如果起始点不在四个角落的其中一个,则无法填满整个方阵,i=6,j=7,k=2,N=9结果如下
/*
边长:9

14 15 16 17 18 19 20 21 22
13 0 0 0 0 0 0 0 23
12 0 0 0 0 0 0 0 24
11 0 0 0 0 0 0 0 25
10 0 0 0 0 0 0 0 26
9 0 0 0 0 0 0 0 27
8 7 6 5 4 3 2 1 28
39 40 41 42 43 44 45 46 29
38 37 36 35 34 33 32 31 30

46个方块绘制完毕!
*/

// At last,楼主很小气,问题点数为0
heiun 2007-04-06
  • 打赏
  • 举报
回复
我也在想这个问题,但还没想出来。等待高手指点一下啊。
panlianges 2007-04-06
  • 打赏
  • 举报
回复
不过还是谢谢。。。

等待好人路过。。。并给出答案。。。
panlianges 2007-04-06
  • 打赏
  • 举报
回复
不是输入这么简单。。。
是按照规律求出数字并显示。。。
fohonet 2007-04-06
  • 打赏
  • 举报
回复
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);



:)

69,371

社区成员

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

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