DFS
碰到边界或者已经搜过的格子就顺时针旋转,等价于:d = (d + 1) % 4
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int g[N][N];
int n, m, d;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
void dfs(int x, int y, int u)
{
if (u > n * m) return ; // 边界
if (x < 0 || x >= n || y < 0 || y >= m || g[x][y]) return ;
g[x][y] = u;
dfs(x + dx[d], y + dy[d], u + 1);
d ++, d %= 4; // 调整
dfs(x + dx[d], y + dy[d], u + 1);
}
int main()
{
cin >> n >> m;
dfs(0, 0, 1);
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
printf("%d ", g[i][j]);
puts("");
}
return 0;
}