OJ练习关于矩阵填数那些事儿
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OJ练习关于矩阵填数那些事儿相关的知识,希望对你有一定的参考价值。
一、背景
最近,学校的OJ截止日期快截止了,于是开始猛补。遇到一道回折矩阵的题目。想起来去年蓝桥杯也考了一道蛇形填数,说难不难,但动手实现起来,还是有点磕磕绊绊,下面来总结一下。
二、解决思路
- 分析数的填充路径规律
可以动手在草稿纸上面画画,看看填数的规律,一般是走几步就重复此规律进行下去,所以说分析填充规律其实很简单,拿回形矩阵来说,规律就是往右走到尽头在下走到尽头再左、上如此循环直到结束。 - 分析控制坐标
设立一个计数的counter和一个i,j表示矩阵的横纵坐标,i控制左右,j控制 上下,然后注意起止点即可。 - 几种常见矩阵填数的实现代码
// 蛇形方阵
#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练习关于矩阵填数那些事儿的主要内容,如果未能解决你的问题,请参考以下文章