AC代码
#include<iostream>
using namespace std;
const int N = 105;
int n,m,arr[N][N]; ///n--行数 m--列数 arr--矩阵
int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; ///方向数组,右下左上的顺序
bool judge(int x,int y){ ///判断是否越界
if(x<0||x>=n||y<0||y>=m)
return false;
else
return true;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;++i) ///初始化数组为-1
for(int j=0;j<m;++j)
arr[i][j]=-1;
int x=0,y=-1; ///起始坐标
int count=0; ///计数变量
while(1){ ///模拟了沿一个方向走到不能再走
for(int j=0;j<4;++j){
while(arr[x+dr[j][0]][y+dr[j][1]]==-1&&judge(x+dr[j][0],y+dr[j][1])){ ///判断是否还能沿这个方向走
x=x+dr[j][0];y=y+dr[j][1];
arr[x][y]=++count;
}
}
if(count==n*m)
break;
}
for(int i=0;i<n;++i){
for(int j=0;j<m;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
return 0;
}
另一种模拟法
#include<iostream>
using namespace std;
const int N = 105;
int n,m,arr[N][N]; ///n--行数 m--列数 arr--矩阵
int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; ///方向数组,右下左上的顺序
bool judge(int x,int y){ ///判断是否越界
if(x<0||x>=n||y<0||y>=m)
return false;
else
return true;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;++i) ///初始化数组为-1
for(int j=0;j<m;++j)
arr[i][j]=-1;
int x=0,y=0,d=0; ///起始坐标 d--控制当前方向
for(int i=1;i<=n*m;++i){
arr[x][y]=i;
int x1=x+dr[d][0],y1=y+dr[d][1];
if(!judge(x1,y1) || arr[x1][y1]!=-1){ ///下个位置非法的情况
d=(d+1)%4; ///用取模实现方向轮换
x1=x+dr[d][0];
y1=y+dr[d][1];
}
x=x1;y=y1;
}
for(int i=0;i<n;++i){
for(int j=0;j<m;++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
return 0;
}
引入参数d模拟一直朝着某个方向走,(d+1)%4 实现方向的循环轮换
要点
方向数组+边界控制,模拟蛇形行走
相关题目
AcWing 844. 走迷宫
AcWing 1102. 移动骑士
AcWing 1421. 威斯康星方形牧场