题目2
(2/2 分数)
题目描述
给定一个nxn(n<10)的方阵,请输出左上角开始逆时针从大到小填充方阵的结果。
输入格式输入方阵的大小n
输出格式方阵填充结果,每个数字均占两位并右对齐,以一个空格隔开
样例输入
4样例输出
16 5 6 7 15 4 1 8 14 3 2 9 13 12 11 10代码框
//利用vector二维数组实现
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
void filling_matrix(vector<vector<int> >&matrix,int num,int loc,int size);
int main(){
int n;
cin>>n;
if(n>=10) return false;
vector<vector<int> >matrix(n);
for(int i=0;i<n;i++)
matrix[i].resize(n);
int num=n*n;
int size=n;
filling_matrix(matrix,num,0,size);
for (int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<setw(2)<<matrix[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
void filling_matrix(vector<vector<int> >&matrix,int num,int loc,int size){
if(size==0) return;
if(size==1){
matrix[loc][loc]=num;
return;
}
for(int i=0;i<size-1;i++){
matrix[loc+i][loc]=num-i;
matrix[loc+size-1][loc+i]=num-(size-1)-i;
matrix[loc+size-1-i][loc+size-1]=num+-2*(size-1)-i;
matrix[loc][loc+size-1-i]=num-3*(size-1)-i;
}
filling_matrix(matrix,num-4*(size-1),loc+1,size-2);
}
*******************************************************************************************************************
//封装了一下,利用行优先的一维数组实现
#include <cstring>
#include <iostream>
#include <iomanip>
using namespace std;
class Matrix{
int row,col;
char dir;
int _size; //方阵规模
int *_data; //数据空间
public:
int findPosition();
Matrix(int size);
~Matrix();
void fill();
friend ostream&operator<<(ostream &out,const Matrix&m);
};
Matrix::Matrix(int size):_size(size),row(-1),col(0),dir('D'){
_data=new int[size*size];
//用0填充矩阵
memset(_data,0,sizeof(int)*_size*_size);//void *memset(void *s, int ch, size_t n);函数解释:将s中当前位置后面的n个字节(typedef unsigned int size_t )
//用 ch替换并返回 s 。
}
Matrix::~Matrix(){
delete[]_data;
}
ostream&operator<<(ostream&out,const Matrix&m){
for(int r=0;r<m._size;r++){
for(int c=0;c<m._size;c++)
out<<setw(4)<<*(m._data+r*m._size+c);
out<<endl;
}
return out;
}
void Matrix::fill(){
for(int num=1;num<=_size*_size;num++){
int pos=findPosition();
_data[pos]=num;
}
}
int Matrix::findPosition(){
switch(dir){
case'D':
if(row<_size-1&&_data[(row+1)*_size+col]==0)
row++;
else{
dir='R';
col++;
}
break;
case'R':
if(col<_size-1&&_data[row*_size+col+1]==0)
col++;
else{
dir='U';
row--;
}
break;
case'U':
if(row>0&&_data[(row-1)*_size+col]==0)
row--;
else{
dir='L';
col--;
}
break;
case'L':
if(col>0&&_data[row*_size+col-1]==0)
col--;
else{
dir='D';
row++;
}
break;
}
return row*_size+col;
}
int main(){
cout<<"Please input N:";
int size;
cin>>size;
Matrix obj(size);
obj.fill();
cout<<obj;
return 0;
}