打印螺旋矩阵

大家也许都见过这个题目 ,我开始遇到的是让打印方阵。后来想想打印普通矩阵也是可以的

我写了一下程序是按顺时针方向打印的,

 初步想法是预先申请数组缓存a[20][20]或更大的缓存。

当然也可以动态申请数组缓存的

 

谁有更好的方法可以帮我修改一下,谢谢!

 

运行如下:

 

运行如下: array 5*11

 

当然你可以加上MFC界面

螺旋矩阵10×10

 

// 螺旋数组.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
#define  M  20
#define  N  20
//void  createArray(int n)
//{
//       int **a=new int *[n];//动态建立二维数组
//       for(int i=0;i<n;i++)
//            a[i]=new int[n];
//  
//};

//array[i][j] ====== *((int*)array + n*i + j)
void printfArray(int **array, int m, int n)
{
    //a[i][j]  = *((int*)array + n*i + j);
    for (int i=0;i<m;i++)
    {
        for (int j =0;j <n;j++)
        {
             cout<< setw(6)<<*((int*)array + n*i + j)<<"  ";
        }
        cout<<endl;
    }

};

void helixArray3(int a[][N],int m,int n=0)
{
    int m_Count = 1;
    int total=m*n;
    int i=0;
    int j =0;
    int num=0;
    while(m_Count<total)
    {
        num=0;
        while (num++< n -1)
        {
            a[i][j++] = m_Count++;
        }
        num=0;
        while (num++< m-1)
        {
            a[i++][j] = m_Count++;
        }
        num=0;
        while (num++< n-1)
        {
            a[i][j--] = m_Count++;
        }
        num =0;
        while (num++< m-1)
        {
            a[i--][j] = m_Count++;
        }
        //cout<<endl;
        //cout<<"i="<<i<<" j="<<j<<" n= "<<n<<"    m_Count"<<m_Count<<endl;
        j++;
        i++;
        n= n-2;
        m= m-2;
        if (m==1&&n>1)//如果n为奇数会出现最后m=1的情况
        {
            cout<<"test"<<endl;
                num=0;
           while (num++<n)
           {
                a[i][j++]=m_Count++;
           }
          
        }
        if (n==1&&m>1)//如果n为奇数会出现最后n=1的情况
        {  cout<<"test2"<<endl;
            num=0;
            while (num++<m)
            {
                a[i++][j]=m_Count++;
            }

        }
        if (n==1&&m==1)
        {
            a[i][j]=m_Count++;
        }
       
    }
};

int main(int argc, _TCHAR* argv[])
{
  

    cout<<"--------------------------------------------------------------"<<endl;
   int b[M][N];//
 //这里可以要求输入(m <M &&n <N)即可
   helixArray3(b,M,N);
   printfArray((int**)b,M,N);
   cout<<"--------------------------------------------------------------"<<endl;
   cin.get();//意外发现这里读取的是上次输入留下的的'/n'
   cin.get();
   return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值