/*作者: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;
}
/* 程序结束 */