蛇形矩阵问题
2017-04-02 14:56
435 查看
题目描述
小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.解答
使用分治算法, 如果给出蛇形矩阵 n * n 的前 m - 1层填充结果, 按照定义很容易填充第 m 层, 从而可以得到整个蛇形矩阵的填充图.代码:
#include <iostream> using namespace std; void arrInsert(int **arr, int n, int m); int main() { int n; cin >> n; /*动态生成二维数组*/ int **arr; arr = new int * ; for(int i = 0; i < n; ++i) { arr[i] = new int ; } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { arr[i][j] = 0; } } /*填充矩阵*/ if(n % 2) { //奇数 arrInsert(arr, n, n / 2); //填充 n * n矩阵的 n / 2层 } /*显示结果*/ int sum = 0; //保存对角线的和 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << arr[i][j] << " "; if (i == j ) { //对角线 sum += arr[i][j]; } else if(j - n / 2 == n / 2 - i) { //反对角线 sum += arr[i][j]; } } cout << endl; } cout << sum << endl; /*释放内存*/ for(int i = 0; i < n; ++i) { delete[] arr[i]; } delete[] arr; return 0; } void arrInsert(int **arr, int n, int m) { int mid = n / 2; if(m == 0) { arr[mid][mid] = 1; } else { arrInsert(arr, n, m - 1); //填充里面的 m - 1层 arr[mid + m - 1][mid + m] = arr[mid + m - 1][mid + m - 1] + 1; for (int i = mid + m - 2; i >= mid - m; --i) { arr[i][mid + m] = arr[i + 1][mid + m] + 1; } for (int j = mid + m - 1; j >= mid - m; --j) { arr[mid - m][j] = arr[mid - m][j + 1] + 1; } for (int i = mid - m + 1; i <= mid + m; ++i) { arr[i][mid - m] = arr[i - 1][mid - m] + 1; } for (int j = mid - m + 1; j <= mid + m; ++j) { arr[mid + m][j] = arr[mid + m][j - 1] + 1; } } }
相关文章推荐
- 蛇形矩阵问题。
- php打印蛇形回路二维矩阵问题
- 算法之矩阵链乘法问题
- GDI+托管代码坐标变换矩阵复位问题
- 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
- 矩阵连乘问题
- 一个难解的矩阵问题~~求解
- 用C++实现打印蛇形矩阵
- 数学之美(系列十八) 之 矩阵运算和文本处理中的分类问题
- 数学之美 系列十八 - 矩阵运算和文本处理中的分类问题
- 矩阵中填数. 当给出 N*N 的矩阵要求按蛇形填,回转填数
- GDI+托管代码坐标变换矩阵复位问题
- 矩阵的蛇形填充
- 【数学之美系列十八 】矩阵运算和文本处理中的分类问题
- 数学之美 系列十八 - 矩阵运算和文本处理中的分类问题
- 学之美 系列十八 - 矩阵运算和文本处理中的分类问题
- 求矩阵的最大路径的问题
- 关于矩阵运算和文本处理中的分类问题 来自Google 研究员,吴军
- 关于矩阵加括号的问题
- 关于矩阵运算的若干问题