OJ练习关于矩阵填数那些事儿

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OJ练习关于矩阵填数那些事儿相关的知识,希望对你有一定的参考价值。

一、背景

最近,学校的OJ截止日期快截止了,于是开始猛补。遇到一道回折矩阵的题目。想起来去年蓝桥杯也考了一道蛇形填数,说难不难,但动手实现起来,还是有点磕磕绊绊,下面来总结一下。

二、解决思路

  1. 分析数的填充路径规律
    可以动手在草稿纸上面画画,看看填数的规律,一般是走几步就重复此规律进行下去,所以说分析填充规律其实很简单,拿回形矩阵来说,规律就是往右走到尽头在下走到尽头再左、上如此循环直到结束。
  2. 分析控制坐标
    设立一个计数的counter和一个i,j表示矩阵的横纵坐标,i控制左右,j控制 上下,然后注意起止点即可。
  3. 几种常见矩阵填数的实现代码
// 蛇形方阵
#include"iostream"
using namespace std;
int main(){

	int n;
	while(cin>>n){
		int matrix[n][n];
		
		int i =0,j =0;
		int num=1;
	
		 matrix[i][j]=num;
		while(num<=n*n){		
			
			if(num==n*n){
				break;
			}
			while(i<n){
		    //		 matrix[i++][j]=num++;
				  matrix[i][j]=num;
				  i++;
				  num++;
			}	 
			
			
			i--;
			j++;
			while(j<n&&i>=0)
			// matrix[i--][j]=num++; 
			{
				  matrix[i][j]=num;
				  i--;
				  num++;
			}
			i++;
			j++;
			
		}
		
		for(int i =0;i<n;i++){
			for(int j=0;j<n;j++){
				cout<<matrix[i][j]<<" ";
			}
			cout<<endl;
		}
		cout<<endl;
		
		
	}
	
	return 0;
}
// 回折矩阵
#include"iostream"
using namespace std;
/**
  1 2 9
  4 3 8
  5 6 7 
*/
int main(){
	
	int n;
	while(cin>>n){// java 中如何写?? 
		int step =1;
		int i=0,j=0,val=1;
		int matrix[n][n];
		matrix[0][0]=val;//起始点 
		if(n==1){
			cout<<"1"<<endl;
			continue;
		}
		while(val<=n*n){
			
			int counter=0;//计数器
		 
			// 往右走一步
			matrix[i][++j]=++val;
			
			// 往下走step步
			 while(counter<step){
			 	matrix[++i][j]=++val;
			 	counter++;
			 }
			
			// 往左走至 j=0
			while(j>0){
				matrix[i][--j]=++val;
			} 
			if(val==n*n){
				break;
			}
			
			// 往下走一步
			matrix[++i][j]=++val;
			
			// 往右走step+1步
			step++; 
			counter=0;//归零
			while(counter<step){
				matrix[i][++j]=++val;
				counter++;
			} 
			
			// 向上至0 
			counter = 0;
			while(i>0){
				matrix[--i][j]=++val;
				counter++;
			} 
			if(val==n*n){
				break;
			}else{
				step++;// 下一个step需要++ 
			}
			 
		}
		
		for(int i =0;i<n;i++){
			for(int j=0;j<n;j++){
				cout<< matrix[i][j]<<" ";
			}
			cout<<endl;
		}
	
	}
	
	
} 
#include"iostream"
using namespace std;
// 回形矩阵
int main(){
	int n;
	while(cin>>n){
		int i=0,j=0;// 初始化矩阵坐标值 
		int val=1;
		int matrix[n][n];
		
		for(int i =0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			   matrix[i][j]=0;
		}
				
		matrix[0][0]=1;//起点 

		while(true){
			
			if(val==n*n){
				break;//终点出口 
			}
			
			// 向右走 
			while(j+1<n&&matrix[i][j+1]==0)//下一步合法,且为空 
			    matrix[i][++j]=++val;
			
			if(val==n*n){
				break;
			}
	        // 向下走 
			while(i+1<n&&matrix[i+1][j]==0)
			    matrix[++i][j]=++val;
		    
		   	if(val==n*n){
				break;
			}
		    // 向左走				
		    while(j-1>=0&&matrix[i][j-1]==0)
		        matrix[i][--j]=++val;
		    
			if(val==n*n){
				break;
			}   
			// 向上走 
		    while(i-1>=0&&matrix[i-1][j]==0)   
			    matrix[--i][j]=++val; 
					 	
		}
		
		// 输出 
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				cout<<matrix[i][j]<<" ";
			}
			cout<<endl;
		}
		
	}
} 

以上是关于OJ练习关于矩阵填数那些事儿的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ5010: [Fjoi2017]矩阵填数

关于闭包那些事儿

南阳oj 蛇形填数

关于IDE和云端代码浏览的那些事儿

算法零基础学习关于素数的那些事儿

算法零基础学习关于素数的那些事儿