注册 登录
编程论坛 C++教室

关于数组的题~

lzp311 发布于 2010-04-22 22:38, 1226 次点击
我刚接触数组,偶尔看到的题,请高手多提供几种方法~C语言或C++方法都行~
1   2    3   4    5  6
20  21   22  23  24  7
19  32   33  34  25  8
18  31   36  35  26  9
17  30   29  28  27 10
16  15  14  13   12 11
谢谢了!!
16 回复
#2
ljt2010-04-23 10:13
你要干嘛??
#3
南国利剑2010-04-23 13:05
楼主,是要写一个程序能够实现输出满足你给出的规律的数组吧?
#4
mywaylgh2010-04-23 16:49
螺旋矩阵赋值嘛
算法:起始方向为右,碰壁(非零值)后按右下左上的顺时针改变方向。

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int **a;
    int i,j;
    int n=1,row,direction;

    printf("Input the number of rows:");
    scanf("%d",&row);

    //set matrix
    a = (int **)malloc((row+2)*sizeof(int *));
    for (i=0;i<row+2 ;i++ )
        a[i]=(int *)calloc(row+2,sizeof(int));

    //initail wall
    for (i=0;i<row+2 ;i++ )
    {
        a[i][0]=1;
        a[0][i]=1;
        a[i][row+1]=1;
        a[row+1][i]=1;
    }
    i=1;
    j=1;
    a[1][1]=1;
    direction=1; /* 1 right,2 down,3 left, 4 up */
   
    while(n<row*row)
    {
        if (direction==1)
        {
            if (a[i][j+1]!=0)
            {
                direction=2;
                continue;
            }
            a[i][++j] = ++n;
        }   
        else if(direction==2)
        {
            if (a[i+1][j]!=0)
            {
                direction=3;
                continue;
            }
            a[++i][j] = ++n;
        }
        else if(direction==3)
        {
            if (a[i][j-1]!=0)
            {
                direction=4;
                continue;
            }
            a[i][--j] = ++n;
        }
        else
        {
            if (a[i-1][j]!=0)
            {
                direction=1;
                continue;
            }
            a[--i][j] = ++n;
        }
    }

    //printf
    for (i=1;i<=row ;i++ )
    {
        for (j=1;j<=row ;j++ )
            printf("%d ",a[i][j]);
        printf("\n");
    }

    return 0;
}


#5
玩出来的代码2010-04-23 18:31
程序代码:
#include<stdio.h>
int main(void)
{
    int i,x,j,y,n,a[20][20],k;
    printf("input :");
    scanf("%d",&n);
    for (i=0,y=0,k=1;i<n;i++)
    {
        x=i;
        while (x<n-i)a[x++][y]=k++;x--;k--;
        while (y<n-i)a[x][y++]=k++;y--;k--;
        while (x+1>i)a[x--][y]=k++;x++;k--;
        while (y>i)a[x][y--]=k++;y++;
    }
    printf("\n");
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
            printf("%6d",a[j][i]);
        printf("\n");
    }
    return 0;
}

#6
南国利剑2010-04-26 23:48
楼上写的不错,顶
#7
2010-04-27 07:10
初学者围观。
#8
wow512010-04-27 09:43
初学者 来围观 自己也试一试哦!
#9
2010-04-27 19:11
回复 5楼 玩出来的代码
就是高手 强了 顶你
#10
lzp3112010-04-29 22:44
回复 4楼 mywaylgh
谢谢了~好方法啊~能告诉我怎么分析这个题吗?感谢大侠了~
#11
lzp3112010-04-29 22:45
回复 2楼 ljt
不好意思,这段学校活动多,很少看,恩,是想得到这样的一个解,作为例题分析的~谢谢大侠的关注
#12
lzp3112010-04-29 22:47
回复 5楼 玩出来的代码
很强~我非常感想提供这样的解法,以后请大侠多多指教,我是新手,慢慢进步啊~
#13
guowei37582010-04-30 20:10
新手来学学
#14
mylzy1592010-05-01 09:59
   第一个就是回溯法.
   第二个是顺时针输入逆逆时针输入.以X做标记.
  
#15
2010-05-01 11:15
有没有c++程序啊?我学的是C++,有点看不懂
#16
2010-05-01 15:20
初学者到此看一下
#17
2010-05-04 23:06
太强大了!!!
1