| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 458 人关注过本帖
标题:一步一步教你写程序:螺旋矩阵
只看楼主 加入收藏
xtayaitak
Rank: 2
等 级:论坛游民
帖 子:20
专家分:11
注 册:2009-3-10
结帖率:50%
收藏
 问题点数:0 回复次数:2 
一步一步教你写程序:螺旋矩阵
程序代码:
/*        www.奋斗乐园|C++论坛|算法论坛|ACM/ICPC论坛

                82   81   80   79   78   77   76   75   74   73

                83   50   49   48   47   46   45   44   43   72

                84   51   26   25   24   23   22   21   42   71

                85   52   27   10    9    8    7   20   41   70

                86   53   28   11    2    1    6   19   40   69

                87   54   29   12    3    4    5   18   39   68

                88   55   30   13   14   15   16   17   38   67

                89   56   31   32   33   34   35   36   37   66

                90   57   58   59   60   61   62   63   64   65

                91   92   93   94   95   96   97   98   99  100*/


//看到这个方阵,一想到的就是找规律。这个题目规律只有两个 转圈 自加
//转圈就要给数组元素定位,主要做的工作就是找规律然后根据规律用for简化,然后再赋值。
//如果把一圈当作一个循环的话,那整体循环N/2次

#include <iostream>
using namespace std;
int main()
{
        const int N=10;//这个就不说了
       
        //先建立一个二维数组
        int a[N][N];
       
        //为了观察运行出的错,先把数组各个元素通通赋为0吧,这样一来,有什么错误在运行时候,一看就能看出来。
        for(int i=0;i<N;i++)
                for(int j=0;j<N;j++)
                {
                        a[i][j]=0;
                }
       
       
       
        //试了一下从1赋值,感觉很费事,还是从后往前推吧,最后一个数字是N*N
        int last=N*N;
        int n=N;    //中间变量。
        int i=n-1,j;//第一个循环要用到i(第54行),所以赋个初值
        for(int k=0;k<N/2;k++)//如果把一圈当作一个循环的话,那整体循环N/2次
        {
               
                for(j=n-1;j>k;j--)//给100-92赋值
                        a[i][j]=last--;
                for(i=n-1;i>k;i--)//给91-83赋值
                        a[i][j]=last--;
                for(;j<n-1;j++)   //给82-74赋值
                        a[i][j]=last--;
                for(;i<n-1;i++)   //给73-65
                        a[i][j]=last--;
                //最外面的一圈赋值完成了,进行下一圈。
                n--;i--;
        }
       
        //显示数组各个元素
        for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
        {
                cout<<a[i][j]<<"\t";
                if(j==N-1)         //这要注意换行。
                        cout<<endl<<endl;
        }
        return 0;
}
// www.奋斗乐园|C++论坛|算法论坛|ACM/ICPC论坛 



[ 本帖最后由 xtayaitak 于 2010-10-24 22:19 编辑 ]
搜索更多相关主题的帖子: 螺旋 矩阵 
2010-10-24 22:17
上帝的忏悔书
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-26
收藏
得分:0 

#include<stdio.h>
#include<math.h>
int an(int i,int j);     
void bn (int x);
void cn(int x)               /* 已知数求位置坐标的函数*/
{
    int i,m;
    i=(int)sqrt(x);
    m=(i*i+(i+1)*(i+1)+1)/2;
    if(x==1)
        printf("1=(0,0)\n");
    else
    {
        if(x==(i*i))
        {
            if(i%2)
                printf("%d=(%d,%d)\n",x,(i-1)/2,-(i-1)/2);
            else
                printf("%d=(%d,%d)\n",x,-i/2+1,i/2);
        }
        else
        {
            if (i%2)
            {
                if(x<=m)
                {
                    i;
                    printf("%d=(%d,%d)\n",x,(i+1)/2,(i+1)/2-(m-x));
                }
                else
                {
                    i;
                    printf("%d=(%d,%d)\n",x,(i+1)/2-(x-m),(i+1)/2);
                }
            }
            else
            {
                if(x<=m)
                {
                    int n;
                    n=(-i)/2+(m-x);
                    printf("%d=(%d,%d)\n",x,(-i)/2,(-i)/2+(m-x));
                }
                else
                {
                    i;
                    printf("%d=(%d,%d)\n",x,(-i)/2+(x-m),(-i)/2);
                }
            }
        }
}
}
void main()                   /* 主函数*/
{
    int x,y,z;
    printf("输入一个数字可求其对应坐标:\n");
    scanf("%d",&x);
    cn(x);
    printf("输入一个坐标可求其对应数字.(只输入坐标值)\n");
    scanf("%d%d",&y,&z);
    printf("%d\n",an(y,z));
    printf("输入一个数字N可打印其N阶方阵图形:\n");
    scanf("%d",&y);
    bn(y);
}
void bn (int x)                /* 打印出数列图形的函数*/
{
    int i,j;
    for (j=-((x-1)/2);j<=x/2;j++)
    {
        for(i=-((x-1)/2);i<=x/2;i++)
            printf("%d\t",an(i,j));
        printf("\n");
    }
}
int an(int i,int j)           /* 已知位置坐标求数字的函数*/
{
    int i1,j1,ij;
    i1=abs(i);
    j1=abs(j);
    if (i1<j1)
    {
        ij=i1;
        i1=j1;
        j1=ij;
    }
    if (i+j>0)
    {
        i1=2*i1-1;
        ij=(i1*i1+(i1+1)*(i1+1)+1)/2;
        return ij+j-i;
    }
    else
    {
        i1=2*i1;
        ij=(i1*i1+(i1+1)*(i1+1)+1)/2;
        return ij+i-j;
    }  
}
看看这个
2012-11-29 12:52
上帝的忏悔书
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-26
收藏
得分:0 
这样就不用一步步输入了
2012-11-29 12:53
快速回复:一步一步教你写程序:螺旋矩阵
数据加载中...
 
   



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

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