分析:
创建一个空的二维数组,用于存放答案
遍历数组,进行判断,在相应位置按递增排列
判断方法:
1.可以使用四个if else
判断边界
2.记录偏移量进行判断:
设当前位置坐标为(x,y)
,上、下、左、右方向分别为dr=0 dr=2 dr=3 dr=1
则该位置上、下、左、右的位置所对应的偏移量分别为(x-1,y) (x+1,y) (x,y-1) (x,y+1)
将方向与偏移量的对应关系初始化为两个数组便于引用
每次执行循环后,判断下一个位置是否到达数组边界,或数组中已经存在元素
若满足上述情况,则改变方向
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int a[maxn][maxn]; //定义空的二维数组数组
int dx[]={-1,0,1,0},dy[]={0,1,0,-1}; //初始化方向所对应的偏移量的数组
int main()
{
int n,m;
cin>>n>>m;
int dr=1,x=0,y=0; //初始化开始方向为右,初始化开始的位置
for(int i=1;i<=n*m;i++){
a[x][y]=i; //存入答案
int h=x+dx[dr],l=y+dy[dr]; //定义临时变量存放(x,y)的下一个位置的坐标
if(h<0||l<0||h>=n||l>=m||a[h][l]){ //判断
dr=(dr+1)%4;
h=x+dx[dr],l=y+dy[dr];
}
x=h,y=l; //更新(x,y)
}
for(int i=0;i<n;i++){ //循环打印输出
for(int j=0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
原来这个东西叫做“偏移量”,学习了
是的,我一开始学也是觉得很神奇
我就直接模拟,写的代码很长,一开始确实没想到能这样做
请问一下这里不用临时变量为什么不可以呢
请问这里的a[h][l]为什么代表是否走过呢?
因为a[h][l]初始值为0, 而if (a[h][l])返回的是a[h][l]的值,而且if语句里面只要返回的不是0就为true否则为false
请问这里的a[h][l]为什么代表是否走过呢? 我看代码最上面已经定义了int a[maxn][maxn],未走过的位置的值不应该是随机值吗?如果是随机值非0的话,不是应该会true吗?
求大佬帮忙解答一下
int a[maxn][maxn]
定义在全局区,全局区的数据默认初始值为0
。嘞 明白了!