新人的第一个博客,废话不多说,直接上题目。
输入两个整数 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
蛇形矩阵,在网上还是有很多办法,这里我们用坐标和偏移量来解决。
题目要求我们打印一个二维数组n和m,数字的大小像一条蛇一样依次增大,而这里的难点就是如何让数字“拐弯”,这里我们就用我刚刚提到的坐标和偏移量解决。
首先呢,我们先把二维数组起始点作为坐标起点,设为(x,y),向上移动一格的话坐标就变为(x-1,y),向右的话移动一格坐标就变为(x,y+1),以此类推,向下(x+1,y),向左(x,y+1),x和y的偏移量分别用两个数组存储起来dx和dy。
#include<iostream>
using namespace std;
const int N=110;
int q[N][N];
int main()
{
int n,m;
cin>>n>>m;
int x=0,y=0,d=1;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
然后再设两个变量a和b代表数组x轴和y轴的长度
再设一个变量d控制方向,假定d=1向右,d=2向下,d=3向左,d=0向上,这样d四个值就代表四个方向,那d怎么变化呢,当数组要转动方向的时候,d就+1,可以用先赋值d=1,d=(d+1)%4,这样就可以完美表示数组偏移方向,那我们如何判断数组要拐弯呢?
这里就有两种情况,第一种情况是当蛇撞墙的时候要拐弯,第二种情况是当蛇要咬到自己的时候要拐弯,所以这个时候就要判断一下,所以用代码表示就是if(a<=0‖a>n‖b<=0‖b>m‖q[a][b]),如果撞墙了,d+1,改变方向,a和b以改变,最后跳出判断,x和y刷新一下
for(int i=1;i<=n*m;i++)
{
q[x][y]=i;
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||q[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
最后再把数组打印出来就行。完整代码如下
#include<iostream>
using namespace std;
const int N=110;
int q[N][N];
int main()
{
int n,m;
cin>>n>>m;
int x=0,y=0,d=1;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
for(int i=1;i<=n*m;i++)
{
q[x][y]=i;
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||q[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<q[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
最后如果有什么问题或者疑惑的话欢迎指正和指出,谢谢!