算法1
(遍历) $O(n * m)$
遍历一次就行了
C++ 代码
#include <iostream>
using namespace std;
const int N = 110;
int f[N][N]; // 用是否为0来判断是否被出来过,省略一个状态数组
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int main()
{
int m, n;
cin >> m >> n;
int x = 0, y = 0, t = 0;
// 循环填数
for(int i = 1; i <= m * n; i ++)
{
f[x][y] = i;
x += dx[t];
y += dy[t];
if(x >= m || y >= n || x < 0 || y < 0 || f[x][y])
{
// 如果下一个不符合恢复在处理
x -= dx[t];
y -= dy[t];
t = (t + 1) % 4;
x += dx[t];
y += dy[t];
}
}
// 输出矩阵
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < n; j ++)
cout << f[i][j] << " ";
cout << endl;
}
return 0;
}