一个矩阵的编写(C语言)

buyi006 2009-12-25 07:46:29
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
七扭八弯的矩阵,一会儿顺时针,一会儿逆时针,为了编这个矩阵,我看了拐角,回行,蛇形还有螺旋矩阵,仍然没有思路,希望大家能帮我想想,给个思路就OK~
...全文
275 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
建鼎呓语 2009-12-26
  • 打赏
  • 举报
回复

1--2 9-10 25
| | | |
4--3 8 11 24
| | | |
5--6--7 12 23
| |
16-15-14-13 22
| |
17-18-19-20-21
建鼎呓语 2009-12-26
  • 打赏
  • 举报
回复
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21

从1开始,每次按照指定方向移动指定步数,每移动一步,加一
右1 下1 左1 下1 右2 上2 右1 下3 左3 下1 右4 上4

右1 下1 左1
下1 右2 上2
右1 下3 左3
下1 右4 上4

规律一目了然

jernymy 2009-12-26
  • 打赏
  • 举报
回复

for(int j=1;j<N+1;j++)
printf("%-5d",gh[i][j]);
printf("\n");

这样会更好些
hlyces 2009-12-26
  • 打赏
  • 举报
回复
for(int j=1;j<N+1;j++)
printf("%2d ",gh[i][j]);//换成%2d就可以对齐了
printf("\n");
hlyces 2009-12-26
  • 打赏
  • 举报
回复
N=4
1 2 9 10
4 3 8 11
5 6 7 12
16 15 14 13
N=5
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
//没做对齐,原理是就行
#include  <stdio.h> 
/*
思路:画完一层记录尾点,下次画时只有两种画法
1.下 右 上
2.右 下 左
测试成功!*/

#define N 4

struct _POINT
{
int x ;
int y;
int data;
};
struct _POINT end;



int drawaLay(int gh[][N+1],int n)//画一层
{
if(n==1)
{
end.x=1;
end.y=1;//第一次只能往右
end.data=1;
gh[1][1]=1;
return 0;
}
if((end.x+1)==n)//能否往右
{
gh[end.y][++end.x]=++end.data;//右
while(end.y<n)
gh[++end.y][end.x]=++end.data;//下
while(end.x>1)
gh[end.y][--end.x]=++end.data;//左
}
else if((end.y+1)==n)//能否往下
{
gh[++end.y][end.x]=++end.data;//下
while(end.x<n)
gh[end.y][++end.x]=++end.data;//右
while(end.y>1)
gh[--end.y][end.x]=++end.data;//上
}

return 0;
}

int draw(int gh[][N+1],int n)//画整个
{
for(int i=1;i<=n;i++)
drawaLay(gh,i);
return 0;
}


int main()
{
int gh[N+1][N+1];
draw(gh,N);
for(int i=1;i<N+1;i++)
{
for(int j=1;j<N+1;j++)
printf("%d ",gh[i][j]);
printf("\n");
}
}

buyi006 2009-12-26
  • 打赏
  • 举报
回复
厉害厉害,想了好几天终于在你们的帮助下做出来了,谢谢所有人的帮助,非常感谢。
尤其是hlyces,结贴散分,谢谢大家!!!
pady_pady 2009-12-26
  • 打赏
  • 举报
回复

#include <stdio.h>

template< int N >
void zip()
{
int a[N][N];
int number = 1;
a[0][0] = number++;
for( int i = 1; i < N; ++i )
{
if( i & 1 )
{
for( int j = 0; j < i + 1; ++j )
a[j][i] = number++;
for( int j = i - 1; j >= 0; --j )
a[i][j] = number++;
}
else{
for( int j = 0; j < i + 1; ++j )
a[i][j] = number++;
for( int j = i - 1; j >= 0; --j )
a[j][i] = number++;
}
}
for( int i = 0; i < N; ++i ){
for( int j = 0; j < N; ++j )
printf( "%4d" , a[i][j] );
printf( "\n" );
}
}

int main( int argc, int *argv[] )
{
zip< 20 >();
getchar();
return 0;
}
coolx-w 2009-12-25
  • 打赏
  • 举报
回复
收分..... 原来这里有人答了~
reFreever 2009-12-25
  • 打赏
  • 举报
回复
格式怎么乱了,怎么对起?
reFreever 2009-12-25
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<conio.h>
int main()
{
int n,i,a,x,y,m,b[20][20];
int w=1;
printf("起始位为a的m行折叠方阵,输入a,m:");
scanf("%d%d",&a,&m);
b[1][1]=a;n=a;
for(i=2;i<=m;i++,w++)
{
if(w%2==1)
{
x=1;y=i;b[x][y]=++n;
while(x<i) b[++x][y]=++n;
while(y>1) b[x][--y]=++n;
}
else
{
x=i;y=1;b[x][y]=++n;
while(y<i) b[x][++y]=++n;
while(x>1) b[--x][y]=++n;
}

}
for(x=1;x<=m;x++)
{
for(y=1;y<=m;y++)
printf("%5d",b[x][y]);
printf("\n");
}
getch();
return 0;
}
一个折叠方阵。
yexiongMYBH 2009-12-25
  • 打赏
  • 举报
回复
学习了。
hlyces 2009-12-25
  • 打赏
  • 举报
回复
要画非正方形,请自行改动就可以了
hlyces 2009-12-25
  • 打赏
  • 举报
回复
/*
思路:画完一层记录尾点,下次画时只有两种画法
1.下 右 上
2.右 下 左
本人无环境测试,见谅!*/

#define N 4

struct _POINT
{
int x ;
int y;
data;
}POINT;
POINT end;



int drawaLay(int gh[][],int n)//画一层
{
if(n==1)
{
end.x=1;
end.y=-1;//第一次只能往右
end.data=1;
return 0;
}
if((end.y+1)==n)//能否往下

gh[++end.y][end.x]=++end.data;//下
while(end.x<n)
gh[end.y][++end.x]=++end.data;//右
while(end.y>1)
gh[--end.y][end.x]=++end.data;//上

else if((end.x+1)==n)//能否往右

gh[end.y][++end.x]=++end.data;//右
while(end.y<n)
gh[++end.y][end.x]=++end.data;//下
while(end.x>1)
gh[end.y][--end.x]=++end.data;//左

return 0;
}

int draw(int gh[][],int n)//画整个
{
for(int i=1;i<=n;i++)
drawaLay(gh,i);
return 0;
}


int main()
{
int gh[N+1][N+1];
draw(gh,N);
for(int i=1;i<N+1;i++)
for(int j=1;j<N+1;j++)
printf("%d ",gh[i][j]);
printf("\n");
}
hlyces 2009-12-25
  • 打赏
  • 举报
回复
/*
思路:画完一层记录尾点,下次画时只有两种画法
1.下 右 上
2.右 下 左
本人无环境测试,见谅!*/

#define N 4

struct _POINT
{
int x ;
int y;
data;
}POINT;
POINT end;



int drawaLay(int gh[][],int n)//画一层
{
if(n==1)
{
end.x=1;
end.y=-1;//第一次只能往右
end.data=1;
return 0;
}
if((end.y+1)==n)//能否往下

gh[++end.y][end.x]=++end.data;//下
while(end.x<n)
gh[end.y][++end.x]=++end.data;//右
while(end.y>1)
gh[--end.y][end.x]=++end.data;//上

else if((end.x+1)==n)//能否往右

gh[end.y][++end.x]=++end.data;//右
while(end.y<n)
gh[++end.y][end.x]=++end.data;//下
while(end.x>1)
gh[end.y][--end.x]=++end.data;//左

return 0;
}

int draw(int gh[][],int n)//画整个
{
for(int i=1;i<=n;i++)
drawaLay(gh,i);
return 0;
}


int main()
{
int gh[N+1][N+1];
draw(gh,N);
for(int i=1;i<N+1;i++)
for(int j=1;j<N+1;j++)
printf("%d ",gh[i][j]);
printf("\n");
}
苍蝇①号 2009-12-25
  • 打赏
  • 举报
回复
这两天头太疼了
hlyces 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 z569362161 的回复:]
引用 4 楼 hlyces 的回复:
3L的不行吧。。。。。


怎么不行。
[/Quote]
====================
3L的可以??,你的思路是对的。说3L呢
hlyces 2009-12-25
  • 打赏
  • 举报
回复
有点像贪吃蛇的游戏
z569362161 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hlyces 的回复:]
3L的不行吧。。。。。
[/Quote]

怎么不行。
hlyces 2009-12-25
  • 打赏
  • 举报
回复
3L的不行吧。。。。。
太乙 2009-12-25
  • 打赏
  • 举报
回复
很简单,每一步幅为1,然后撞到墙就回头,每走一步,转换方向(上,右,下,坐)
加载更多回复(2)

69,369

社区成员

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

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