原题链接:点击直接跳转到该题目
1️⃣题目描述
2️⃣题目解析
代码中:dx[]
和 dy[]
数组分别表示了在四个方向上 x
和 y
的变化量。 x
和 y
则是当前要填充的位置坐标, d
则代表方向,初始方向为右(即初始化d
为1,代表一开始的时候初始方向为右方向)。
代码先在 x
、y
坐标处填充了当前的值 i
,然后根据当前方向判断下一个要填的位置坐标。如果下个要填的位置超出边界或者已经被填充过,需要改变方向。
当发生改变方向时,采用了 (d + 1) % 4
的形式来改变方向,其中 % 4 是为了保证方向不超出 4 个。
3️⃣解题代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N = 110;
int arr[N][N];
using namespace std;
int main()
{
int n,m;
cin >> n >> m;
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
int x = 0,y = 0,d = 1; // 这里我们初始化方向为有方向
// 总共有4个方向:分别为上下左右,上为0、右为1、下为2、左为3
// 这里我们要先把一开始要填的位置,即x = 0,y = 0的位置先提前定义出来
for(int i = 1;i <= n * m;i++)
{
arr[x][y] = i;
int a = x + dx[d],b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || arr[a][b])
{
d = (d + 1) % 4;
a = x + dx[d],b = y + dy[d];
}
x = a,y = b; // 这里的x、y即为下一个要填的位置
}
// 打印最终的矩阵即可
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
printf("%d ",arr[i][j]);
cout << endl;
}
return 0;
}
最后代码就顺利通过啦!!!