| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8502 人关注过本帖
标题:关于输出螺旋方阵的问题
只看楼主 加入收藏
Topsail
Rank: 2
等 级:论坛游民
帖 子:18
专家分:13
注 册:2015-4-21
结帖率:83.33%
收藏
已结贴  问题点数:15 回复次数:9 
关于输出螺旋方阵的问题
下面是5×5的螺旋方阵。请编程生成n×n(n<10)阶方阵。
          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
不知道用什么算法表示这个方阵,我一点思路都没有,谁能给我说一下思路。
不需要代码,思路就好。
2015-05-17 10:56
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
最简单的就是行程开关的模式了代码如下:
程序代码:
#include<stdio.h>
#define sz 5
void spma(int *p,int n)
{//行程开关方式设置螺旋矩阵
    int a[4][2]={1,0,0,1,-1,0,0,-1};  //设定行程开关
    int i,j,k,l,m,i1,j1;
    for(i=0;i<n*n;i++)p[i]=0;
    for(l=0,k=0,i=0,j=0;l<n*n;l++)
    {
        i1=i;
        j1=j;
        m=i*n+j;
        p[m]=l+1;
        i1+=a[k][0];
        j1+=a[k][1];
        if(i1==n||j1==n||i1<0||j1<0||p[i1*n+j1])
        {
            k++;
            if(k==4)k=0;  //调节行程开关
        }
        i+=a[k][0];
        j+=a[k][1];
    }
       
}
void main()
{
    int a[sz][sz];
    int i,j;
    spma(&a[0][0],sz);
    for(i=0;i<sz;i++)
    {
        for(j=0;j<sz;j++)printf("%d\t",a[j][i]);
        printf("\n");
    }
}



能编个毛线衣吗?
2015-05-17 13:01
Topsail
Rank: 2
等 级:论坛游民
帖 子:18
专家分:13
注 册:2015-4-21
收藏
得分:0 
回复 2楼 wmf2014
行程开关是什么?我新学,从来没见过,代码看不太懂,能解释一下吗。
2015-05-17 15:55
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:5 
下面的代码长一些,可能好理解些,供参考:
#include <stdio.h>
#define N 100    //最大98x98
int a[N][N];
main()
{
    int i,j,k,n,m=0;
    scanf("%d",&n);
    for(i=0;i<=n+1;i++)//方阵四周不能填数,=0表示可填数
    {
        a[i][0]=-1;
        a[i][n+1]=-1;
        a[0][i]=-1;
        a[n+1][i]=-1;}
    k=1;
    a[1][1]=1;
    i=1;j=1;
    while(1)
    {   switch(m)
        {
        case 0:     //右方填数
            if(a[i][j+1])   //如果右方没有可填位置
               m=1;        //改为下方填数
            else
              a[i][++j]=++k;
            break;
        case 1:    //下方填数
            if(a[i+1][j])
               m=2;
            else
              a[++i][j]=++k;
            break;
        case 2:   //左方填数
            if(a[i][j-1])
               m=3;
            else
               a[i][--j]=++k;
            break;
        case 3:      //上方填数
            if(a[i-1][j])
               m=0;
            else
             a[--i][j]=++k;
        }
        if(k==n*n)break;  //如果输填完则结束
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
 printf("%5d",a[i][j]);
 printf("\n");
}
}
2015-05-17 16:50
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:5 
#include <stdio.h>
int main()
{
int n,i,j,k=0;
scanf("%d",&n);                     
int mat[n][n];
for (i=0;i<(n+1)/2;i++)            
{                                 
for (j=i;j<=n-i-1;j++)         
mat[i][j] = ++k;           
               
for (j=i+1;j<=n-i-1;j++)      
mat[j][n-i-1] = ++k;
               
for (j=n-i-2;j>=i;j--)         
mat[n-i-1][j] = ++k;
                  
for (j=n-i-2;j>=i+1;j--)      
mat[j][i] = ++k;
}
for (i=0;i<n;i++)        
{
for (j=0;j<n;j++)
printf("%d\t",mat[i][j]);
printf("\n");
}
}

剑栈风樯各苦辛,别时冰雪到时春
2015-05-17 17:15
Topsail
Rank: 2
等 级:论坛游民
帖 子:18
专家分:13
注 册:2015-4-21
收藏
得分:0 
回复 5楼 林月儿
你这样编译不出来啊,定义数组的时候不能用变量呀。只能用数,就不好输入了。
2015-05-17 20:35
Topsail
Rank: 2
等 级:论坛游民
帖 子:18
专家分:13
注 册:2015-4-21
收藏
得分:0 
嗯,我懂了,好好学学。
2015-05-17 20:51
LGing
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:107
注 册:2015-3-15
收藏
得分:0 
回复 楼主 Topsail
#include<stdio.h>
main()
{
    int i,j,a,k=0,m;
    scanf("%d",&a);
    for (i=0;i<a;i++)
        for (j=0;j<a;j++)
        {
            k+=1;
            printf("%d\t",j+1);
            for (m=1;m<=a;m++)
                if (k==a*m)
            {
                printf("\n");
            }
        }
}
好像可以吧,多多指教
2015-05-17 23:06
LGing
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:32
专家分:107
注 册:2015-3-15
收藏
得分:0 
回复 8楼 LGing
没看清楚题,错了
2015-05-17 23:08
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 2楼 wmf2014
行程开关是半自动车床里用的一种开关,把行程开关布置到进刀路线上,当碰到该开关后,由程序决定车刀的下一步动作。
用在这个程序里,行程开关实际上就是边界判定,当对数组赋值到达边界时,指挥二维数组下标顺时针旋转,二维数组a是事先设定好的顺时针旋转的步进量。

能编个毛线衣吗?
2015-05-18 08:47
快速回复:关于输出螺旋方阵的问题
数据加载中...
 
   



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

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