考试2 矩阵填充

题目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;
}





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值