题目描述
输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数n和m。
输出格式
输出满足要求的矩阵。
矩阵占n行,每行包含m个空格隔开的整数。
数据范围
1≤n,m≤100
样例
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5
思路:
模拟法:用一个二维数组来模拟蛇形矩阵。
定义4个方向,从第一行开始往数组填数字,碰到边界转向。
边界判断:数组下标越界或者此处已填。
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,row=0,col=0,direction=0;
void turn(){ //转向
direction=(direction+1)%4;
}
void forward(){ //前进
if(direction==0) col++;
else if(direction==1) row++;
else if(direction==2) col--;
else if(direction==3) row--;
}
void back(){ //后退
if(direction==0) col--;
else if(direction==1) row--;
else if(direction==2) col++;
else if(direction==3) row++;
}
int main(){
cin>>m>>n;
vector<vector<int>> a(m,vector<int>(n));
for(int i=1;i<=m*n;i++){ //
a[row][col]=i;
forward(); //先前进一步,通过判断是否越界,以及是否遇到障碍物,来决定转向还是前进
if(row>=m||col>=n||row<0||col<0||a[row][col]!=0){ //边界判断
back(); //此处不可填,后退一步
turn(); //先转向
forward(); //再前进
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
1