螺旋数组算法(Using C++, BCC32编译通过)

/*作者:XiaoSong
**时间:2008年3月4日
**Email:QiruiSong@126.com
**说明:面试常见算法问题,使用递归完成螺旋过程,另外矩阵使用2维动态数组实现
****/

#include <iostream>
#include <iomanip>

using namespace std;

/************** 函数声明 **************/
int** initMatrix(int);
void outputMatrix(int**, int);
void makeSpiralArray(int** , int, int, int, int);
void delMatrix(int**, int);

/************** 主函数 **************/
void main() {

  int dim;
   // 从屏幕输入一个整数作为矩阵的维数
  do {
  cout << "请输入一个大于1的整数 dim: " << endl;
  cin >> dim;
  if (dim < 2)
  cout << "矩阵维数应该大于1,请重新输入!/n/n";
 }  while (dim < 2);

 // 生成一个维数为dim的矩阵
 int** a = initMatrix(dim);

 // 将该矩阵改造为螺旋矩阵
 makeSpiralArray(a, 0, dim-1, 1, dim);

 // 输出螺旋矩阵
 outputMatrix(a, dim);
 
 // 删除矩阵
 delMatrix(a, dim);
}

/************** 函数定义 **************/
void makeSpiralArray(int** a, int min, int max, int first, int dimension) {

 //这是dim为偶数时会出现的情况
 if (max < min) 
  //无中心位置,直接退出
  return;

 //这是dim为奇数时会出现的情况
 else if (min == max) { 
  //为中心位置赋值,然后退出
  a[max][min] = dimension * dimension;
  return;
 }

 else {
  //同时为四面墙赋一轮值
  for (int i = 0; i < (max-min); ++i)  {
   a[min][min+i] = first + i;
   a[min+i][max] = first + i + (max-min);
   a[max][max-i] = first + i + 2*(max-min);
   a[max-i][min] = first + i + 3*(max-min);
  }

 /* 递归,进入下一轮 */
 makeSpiralArray(a, min+1, max-1, a[min+1][min]+1, dimension);
 }
}

int** initMatrix(int dim) {
 //初始化一个维数大小为dim的矩阵,使用2维动态数组表示
 int **a = new int*[dim];
 for (int i = 0; i < dim; ++i)
  a[i] = new int[dim];
 return a;
}

void outputMatrix(int** a, int dim) {
 // 输出维数为dim的矩阵
 for (int i = 0; i < dim; ++i) {
  for (int j = 0; j < dim; ++j) {
   cout << setw(8) << a[i][j];
  }//endin
  cout << '/n';
 }//endout
}

void delMatrix(int** a, int dim){
 //从内存中删除二维数组a
 for (int i = 0; i < dim; ++i)
  delete[] a[i];
 //以与声明次序相反的顺序撤销数组空间
 delete[] a;
}
/* 程序结束 */ 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值