大家也许都见过这个题目 ,我开始遇到的是让打印方阵。后来想想打印普通矩阵也是可以的
我写了一下程序是按顺时针方向打印的,
初步想法是预先申请数组缓存a[20][20]或更大的缓存。
当然也可以动态申请数组缓存的
谁有更好的方法可以帮我修改一下,谢谢!
运行如下:
当然你可以加上MFC界面
// 螺旋数组.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;
}