模拟。方向顺序是右下左上。走下一步之前要先保证下一步能走。
#include<bits/stdc++.h>
using namespace std;
int vis[105][105];
int main()
{
int n,m;
cin>>n>>m;
int cnt=1,x=1,y=1;
vis[x][y]=cnt;
while(1){
while(y+1<=m&&!vis[x][y+1])vis[x][++y]=++cnt;
while(x+1<=n&&!vis[x+1][y])vis[++x][y]=++cnt;
while(y-1>=1&&!vis[x][y-1])vis[x][--y]=++cnt;
while(x-1>=1&&!vis[x-1][y])vis[--x][y]=++cnt;
if(cnt>=n*m)break;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<vis[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}