蛇形矩阵题目自我总结记录
题目:输入两个整数 n 和 m,输出一个 n 行 m 列的矩阵,将数字 1 到 n × m 按照回字蛇形填充至矩阵中
列如输出一个3行4列的蛇形矩阵
解决这个问题需要解决四个方向上的移动问题
向左 | (x, y-1) |
---|---|
向右 | (x, y+1) |
向上 | (x-1, y) |
向下 | (x+1,y) |
这里的坐标与数学上有所不同
代码1:
#include <iostream>
using namespace std;
const int N = 101;
int a[N][N]; // 定义一个二维数组
int n, m;
int main() {
cin >> n >> m; // 输入行和列的值
int left = 0, right = m - 1, top = 0, bottom = n - 1;
// 利用四个量表示边界
int m = 1; // 表示该值走到了那个位置并输出这个值
while (left <= right && top <= bottom)
{
for (int i = left ; i <= right; i ++)
{
a[top][i] = m ++; // 向右走
}
for (int i = top + 1; i <= bottom; i ++)
{
a[i][right] = m ++; // 向下走
}
for (int i = right - 1; i >= left && top < bottom; i --)
{
a[bottom][i] = m ++; // 向左
}
for (int i = bottom - 1; i > top && left < right; i --)
{
a[i][left] = m ++; // 向上
}
left ++, right --, top ++, bottom --; // 每次缩小边界
}
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < m; j ++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
代码2:
利用四个方向上的偏移量移动
#include <iostream>
using namespace std;
int res[100][100];
int main()
{
int n, m;
cin >> n >> m;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0}; // 四个方向上的偏移量
for (int x = 0, y = 0, d = 0, k = 1; k <= n * m; k ++ )
{
res[x][y] = k;
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= m || res[a][b]) // 防止出界
{
d = (d + 1) % 4; // 四个方向用 d = 0 1 2 3 代表
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ ) cout << res[i][j] << ' ';
cout << endl;
}
return 0;
}
注意边界问题
- 撞墙
- 重复