您的位置:首页 > 其它

矩阵蛇形填数和顺时针输出

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
#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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: