打印蛇形矩阵(我写的太笨了,请达人指点 )。

heidongstar 2004-08-02 04:03:35
如下是我的程序,我想得到一个直接根据行列坐标得到相应值的式子,想了半天未遂,请高人指点。
/*
N=4 N=7
1 3 4 10 1 3 4 10 11 21 22

2 5 9 11 2 5 9 12 20 23 34

6 8 12 15 6 8 13 19 24 33 35

7 13 14 16 7 14 18 25 32 36 43

15 17 26 31 37 42 44

16 27 30 38 41 45 48

28 29 39 40 46 47 49

1<=N<=10;
*/
#include <iostream.h>

int sum[20];

void pm(int n)
{
int i,j=0;
int tmp=0;
for(i=0;i<n;i++)
{
tmp+=++j;
sum[i]=tmp;

}

for(i=n;i<2*n-1;i++)
{
tmp+=j--;
sum[i]=tmp;

}
for(i=0;i<n;i++)
{ cout<<endl;
for(j=0;j<n;j++)
cout<<sum[i+j]-((i+j)%2==0?j:i)<<" ";
}

}
void main()
{
pm(10);
}
...全文
1789 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
梁尚君 2004-08-04
  • 打赏
  • 举报
回复
result=EasyPos.x+EasyPos.y;
result=(result+1)*(result+2)/2;
result=(EasyPos.x+EasyPos.y)%2 ? result-EasyPos.x : result-EasyPos.y;
return (CurPos.x+CurPos.y>size-1)? size*size-result+1:result;


总是有点不明白
高手解释以下啊
heidongstar 2004-08-03
  • 打赏
  • 举报
回复
antijpn(antijpn)的方法和我是一样的,都是判断它是在第几条斜线上,然后算出来。
tuxw 2004-08-03
  • 打赏
  • 举报
回复
汗一个~,楼上的办法不错啊
antijpn 2004-08-03
  • 打赏
  • 举报
回复
楼上是不是没看清题目?楼主要的是“想得到一个直接根据行列坐标得到相应值的式子,想了半天未遂,请高人指点。”

我写了一个,应该可以了的,原点为0,0,传入大小为实际大小
struct Position
{
int x,y;//0,0为起点
};
int func(struct Position CurPos,const int size)
{
struct Position EasyPos,Header;
int result;

if(CurPos.x+CurPos.y>(size-1))
{
EasyPos.x=size-CurPos.x-1;
EasyPos.y=size-CurPos.y-1;
}
else
EasyPos=CurPos;
result=EasyPos.x+EasyPos.y;
result=(result+1)*(result+2)/2;
result=(EasyPos.x+EasyPos.y)%2 ? result-EasyPos.x : result-EasyPos.y;
return (CurPos.x+CurPos.y>size-1)? size*size-result+1:result;

}
void main()
{
struct Position mypos;
for(mypos.x=0;mypos.x<7;mypos.x++)
for(mypos.y=0;mypos.y<7;mypos.y++)
printf("%d ",func(mypos,7));

}
说实话,这个东西纯粹考验数学归纳能力,让学完了数列的高中生就能归纳出这个规律来
tuxw 2004-08-03
  • 打赏
  • 举报
回复
layer 是个多余的东西,从另一个矩阵中改来的,忘了删掉
tuxw 2004-08-03
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

void SnakeMatrix( int *addr, int n );

void main()
{
int n;
printf("input n = ");
scanf("%d", &n);
int *p = (int*)malloc(sizeof(int) * n * n );

SnakeMatrix( p, n );

// 输出
printf("\n");
for( int i=0,j=0; i<n*n; i++ ) {
printf("%4d", p[i]);
if( ++j % n == 0 )
printf("\n");
}

free(p);
}

void SnakeMatrix(int *addr, int n)
{
enum DIRECT { UP, DOWN };

int layer = 0; // 圈数, 由外向内
int num;
int i=0, j=0; // 起始位置

enum DIRECT direct = DOWN; // 初始方向
for(num = 1; num <= n * n; ++num)
{
addr[j * n + i] = num;

switch (direct)
{
case UP:
if (i < n - 1 && j > 0)
{
--j;
++i;
}
else // 越界
{
if (j == 0 && i == n - 1) // 右上角
{
i = n - 1;
j = 1;
}
else if (j == 0) // 上边界
++i;
else // 右边界
++j;

direct = DOWN; // 换向
break;
}
break;
case DOWN:
if(i > 0 && j < n - 1)
{
--i;
++j;
}
else // 越界
{
if(j == n - 1 && i == 0) // 左下角
{
i = 1;
j = n - 1;
}
else if(i == 0 ) // 左边界
++j;
else // 下边界
++i;

direct = UP; // 换向
break;
}
break;
default:
break;
}
}
}

70,023

社区成员

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

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