| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2053 人关注过本帖
标题:蛇形矩阵
只看楼主 加入收藏
qq1923194200
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2019-12-28
收藏
 问题点数:0 回复次数:6 
蛇形矩阵
求助:
蛇形矩阵:
7 8 1
6 9 2
5 4 3
搜索更多相关主题的帖子: 矩阵 
2019-12-28 17:09
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
有个左上角开始转的你自己改改
程序代码:
#include <stdio.h>
int main()
{
        int a[23][19]={0};                         
        int step[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 
        int m,n;      
        int x=0,y=0; 
        int dir=0;   
        int t=0;     
        scanf("%d%d",&m,&n); 
        while(t<m*n)         
        {
                a[x][y]=++t;     
                switch(dir)      
                {
                case 0:
                        if(x+1==m || a[x+1][y])dir=1;  
                        break;
                case 1:
                        if(y+1==n || a[x][y+1])dir=2;
                        break;
                case 2:
                        if(x-1<0 || a[x-1][y])dir=3;
                        break;
                case 3:
                        if(y-1<0 || a[x][y-1])dir=0;
                }
                x+=step[dir][0];               
                y+=step[dir][1];
        }
        for(x=0;x<m;x++)
        {
                for(y=0;y<n;y++)
                        printf("%4d",a[x][y]);
                printf("\n");
        }
        return 0;
}

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2019-12-28 22:46
吕孟伟
Rank: 8Rank: 8
等 级:贵宾
威 望:27
帖 子:200
专家分:870
注 册:2018-10-4
收藏
得分:0 
#include <stdio.h>
#include <string.h>
#define max 20
int main(void)
{
    int n;
    while (scanf("%d", &n)==1&&n){
        int a[max][max];
        memset(a, 0, sizeof(a));
        int x, y;
        int num = a[x=0][y=n-1] = 1;
        
        while(num<n*n){
            while(x+1<n&&!a[x+1][y]) a[++x][y]=++num;
            while(y-1>=0&&!a[x][y-1]) a[x][--y]=++num;
            while(x-1>=0&&!a[x-1][y]) a[--x][y]=++num;
            while(y+1<n&&!a[x][y+1]) a[x][++y]=++num;
        }
        for(x=0; x<n; ++x){
            for(y=0; y<n; ++y){
                printf("%3d", a[x][y]);
            }
            printf("\n");
        }
    }
   

    return 0;
}
输出代码:
3
  7  8  1
  6  9  2
  5  4  3
4
 10 11 12  1
  9 16 13  2
  8 15 14  3
  7  6  5  4
^Z

借用一下侯捷的话:勿在浮沙筑高台。
2019-12-29 09:31
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
这不是蛇形矩阵,而是回旋形矩阵代码,如下:
程序代码:
 #include <stdio.h>
void right (int a);
void down(int a);
void left(int a);
void up(int a);
int a[30][30], i, j, k,l,n,m,x,y,o,p;

 main()
{
    while (scanf("%d%d", &n, &m) != EOF)
    {
        x = n;
        y = m;//用以判断是否结束及输出
        o = n;
        p = m;//用以计算赋值个数
        i = 1;//用以赋值
        j =0 ;
        k = 0;//二维数组下标
        right(i);//从right开始即可
    }
}
void right(int i)
{
    if (i <= x * y)
    {
        for (l = 0; l < m; l++, k++, i++) a[j][k] = i;
        m -= 2;   //下次用right时赋值个数将减少两个
        k -= 1;   //循环结束后,k多加了一个1,减回来
        j += 1;   //下个被赋值的数为本次赋值的最后一个数的左边第一个
        down(i);   //之后函数的操作类似,就不注释了
    }
    else 
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
                printf("%2d", a[i][j]);
                if (j != y - 1) printf(" ");
            }
            printf("\n");
        }

        
}
void down(int i)
{
    if (i <= x * y)
    {
        for (l = 0; l < n-1; l++, j++, i++) a[j][k] = i;
        n -= 2;
        j -= 1;
        k -= 1;
        left(i);
    }
    else
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
            
                printf("%2d", a[i][j]);
                if (j != y - 1) printf(" ");
            }
            printf("\n");
        }

}
void left(int i)
{
    if (i <= x * y)
    {
        for ( l = 0; l < p-1; l++, k--, i++) a[j][k] = i;
        p -= 2;
        k += 1;
        j -= 1;
        up(i);
    }
    else
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
                printf("%2d", a[i][j]);
                if (j != y - 1) printf(" ");
            }
            printf("\n");
        }

}
void up(int i)
{
    if (i <= x * y)
    {
        for ( l = 0; l < o-2; l++, j--, i++) a[j][k] = i;
        o-= 2;
        j += 1;
        k += 1;
        right(i);
    }
    else
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
                printf("%2d", a[i][j]);
                if (j != y - 1) printf(" ");
            }
            printf("\n");
        }

}
2019-12-29 16:26
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
如下的才是蛇形
程序代码:
#include<stdio.h>
main()
{
int i,j,a[100][100],n,k;
printf("请输入列数n= ");
scanf("%d",&n);
k=1;
//输出上三角
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
if(i%2==0) a[i+1-j][j]=k;
else a[j][i+1-j]=k;
k++;
}
//输出下三角
for(i=n+1;i<2*n;i++)
for(j=1;j<=2*n-i;j++)
{
if(i%2==0) a[n+1-j][i-n+j]=k; //n+1在这里是定值了
else a[i-n+j][n+1-j]=k;
k++;
}
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
printf("\n");
}
2019-12-29 16:30
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用forever74在2019-12-28 22:46:50的发言:

有个左上角开始转的你自己改改

#include <stdio.h>
int main()
{
        int a[23][19]={0};                        
        int step[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
        int m,n;      
        int x=0,y=0;
        int dir=0;   
        int t=0;     
        scanf("%d%d",&m,&n);
        while(t<m*n)         
        {
                a[x][y]=++t;     
                switch(dir)      
                {
                case 0:
                        if(x+1==m || a[x+1][y])dir=1;  
                        break;
                case 1:
                        if(y+1==n || a[x][y+1])dir=2;
                        break;
                case 2:
                        if(x-1<0 || a[x-1][y])dir=3;
                        break;
                case 3:
                        if(y-1<0 || a[x][y-1])dir=0;
                }
                x+=step[dir][0];               
                y+=step[dir][1];
        }
        for(x=0;x<m;x++)
        {
                for(y=0;y<n;y++)
                        printf("%4d",a[x][y]);
                printf("\n");
        }
        return 0;
}

方向切换的操作 写得太过于生硬
int tmpx = x + step[dir][0];
int tmpy = y + step[dir][1];
if(0<tmpx || 0<tmpy || tmpx>=m || tmpy>=n || a[tmpx][tmpy])
    dir = (dir+1) % 4;

https://zh.
2020-05-05 15:36
隐藏,
Rank: 1
等 级:新手上路
帖 子:6
专家分:5
注 册:2020-5-5
收藏
得分:0 
#include<stdio.h>
int main()
{int a[100][100]={0};
int l;
int i=0,j=0,m=1,e=0,k=1;
printf("请输入层数:");
scanf("%d",&l);
int n=l-1,h=l-1,z=l*l;
while(k<=z)
{   for(;((m%2==0)?(j>=e):(j<=n));((m%2==0)?(j--):(j++)))
                   {if(k<=z)
                   a[i][j]=k++;
                    else
                    break;}
            if(m%2==0)
                    {i--;e++;j++;}
             else    {j--;i++;}
            if(m%2!=0&&m!=1)
                    h--;
    for(;((m%2==0)?(i>=e):(i<=h));((m%2==0)?(i--):(i++)))
                    {if(k<=z)
                    a[i][j]=k++;
                     else
                        break;}
            if(m%2==0)
                {n--;j++;i++;m++;}
            else {m++;i--;j--;}
}
for(i=0;i<l;i++)
    {for(j=0;j<l;j++)
    printf("%10d",a[i][j]);
printf("\n");
    }

}
这个总感觉有一点缺点!请大佬们指教!
可以回复到“隐藏,”这一个账号,谢谢!
2020-05-07 12:22
快速回复:蛇形矩阵
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029013 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved