矩阵蛇形填数和顺时针输出
2017-08-17 22:20
204 查看
在n*n的方阵里填入1,2,3,···,n*n,要求从右上角开始,例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> printValue;
if(!matrix.empty()){
int row = matrix.size(), column = matrix[0].size();
int start = 0;
while(row > start * 2 && column > start * 2){
printCircle(matrix, printValue, row, column, start);
start++;
}
}
return printValue;
}
void printCircle(vector<vector<int>> matrix, vector<int> &printValue, int row, int column, int start){
int endX = column - 1 - start, endY = row - 1 - start;
if(start <= endX){
for(int i = start; i <= endX; i++){
printValue.push_back(matrix[start][i]);
}
}
if(start < endY){
for(int i = start + 1; i <= endY; i++){
printValue.push_back(matrix[i][endX]);
}
}
if(start < endX && start < endY){
for(int i = endX - 1; i >= start; i--){
printValue.push_back(matrix[endY][i]);
}
}
if(start + 1 < endY && start < endX){
for(int i = endY - 1; i >= start + 1; i--){
printValue.push_back(matrix[i][start]);
}
}
}
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
#include<iostream> #include<iomanip> #include<memory> using namespace std; int main(){ int n; cin >> n; int **a = new int* ; for (int i = 0; i < n; i++){ a[i] = new int ; memset(a[i], 0, n * 4); //注意二维数组的初始化和一维数组不太一样,一维数组之间不是连续的,所以不能用memset(a,0,n*n*4),使用memset需要头文件memory } /*for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ a[i][j] = 0; } }*/ //memset(a, 0, n*n * 4); int num = 1; int x = 0, y = n - 1; a[x][y] = num; while (num < n*n){ while (x + 1 < n&&!a[x + 1][y]){ a[x + 1][y] = ++num; x = x + 1; } while (y - 1 >= 0 && !a[x][y - 1]){ a[x][y - 1] = ++num; y = y - 1; } while (x - 1 >= 0 && !a[x - 1][y]){ a[x - 1][y] = ++num; x = x - 1; } while (y + 1 < n&&!a[x][y + 1]){ a[x][y + 1] = ++num; y = y + 1; } } for (int i = 0; i < n; i++){ int first = 1; for (int j = 0; j < n; j++){ if (first){ cout << a[i][j]; first = 0; } else{ cout << ' ' <<setw(2)<<setiosflags(ios::left) <<a[i][j];//格式化输出,设置宽度为2,默认为右对齐,此处设置为左对齐,头文件为iomanip } } cout << endl; } for (int i = 0; i < n; i++){ //注意要释放内存 delete[] a[i]; } delete[] a; system("pause"); return 0; }
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> printValue;
if(!matrix.empty()){
int row = matrix.size(), column = matrix[0].size();
int start = 0;
while(row > start * 2 && column > start * 2){
printCircle(matrix, printValue, row, column, start);
start++;
}
}
return printValue;
}
void printCircle(vector<vector<int>> matrix, vector<int> &printValue, int row, int column, int start){
int endX = column - 1 - start, endY = row - 1 - start;
if(start <= endX){
for(int i = start; i <= endX; i++){
printValue.push_back(matrix[start][i]);
}
}
if(start < endY){
for(int i = start + 1; i <= endY; i++){
printValue.push_back(matrix[i][endX]);
}
}
if(start < endX && start < endY){
for(int i = endX - 1; i >= start; i--){
printValue.push_back(matrix[endY][i]);
}
}
if(start + 1 < endY && start < endX){
for(int i = endY - 1; i >= start + 1; i--){
printValue.push_back(matrix[i][start]);
}
}
}
相关文章推荐
- java蛇形矩阵输出方法(顺时针、逆时针)
- 矩阵顺时针螺旋输出2种不同的方法。
- 剑指Offer--020-顺时针打印矩阵(蛇形打印矩阵)
- 顺时针输出矩阵
- 矩阵顺时针螺旋输出2种不同的方法。
- 算法 - 蛇形矩阵输出
- 【面试】输出"蛇形"矩阵
- 顺时针打印矩阵(蛇形填空)(两种方式实现)
- 输出一个矩阵,按照顺时针方向内增大
- 顺时针绕圈输出二维数组(蛇形)
- 将n*n矩阵顺时针旋转90度输出
- leetcode 54 54. Spiral Matrix(矩阵顺时针绕圈输出)
- 输出10*10蛇形排列矩阵
- 顺时针输出矩阵
- 九度OJ剑指offer中关于顺时针输出矩阵的问题分析
- 二维数组蛇形和Z形矩阵输出
- JAVA代码—算法基础:将N*N的矩阵顺时针旋转90度输出元素
- 剑指offer——矩阵顺时针输出问题
- 笔试题&面试题:顺时针输出一个矩阵
- Java --随意输入N*N矩阵, 顺时针旋转输出