题目描述
输入两个整数�n和�m,输出一个�n行�m列的矩阵,将数字11到�n×�m按照回字蛇形填充至矩阵中。
具体矩阵形式可参考样例。
输入格式
输入共一行,包含两个整数�n和�m。
输出格式
输出满足要求的矩阵。 矩阵占�n行,每行包含�m个空格隔开的整数。
样例
示例输入 1
3 3
示例输出 1
1 2 3
8 9 4
7 6 5
数据范围
1≤n,m≤100.1≤n,m≤100.
解法思路:
一,可知这是一个模拟动态过程,我们可以先走最外一圈,加上限制条件就可求解
二,把矩阵看成x,y行,先确定行不变,列走到可走(即没有走过的[x][y]行列)最后一列,然后依次把i++的值赋予矩阵[x][++y]中;
三,列不变,然后行走到可走最后一行,同上赋值;
四;行不变,然后行走到可走最后一行,同上赋值,依次类推即可求解。
详细代码如下:
#include <iostream>
using namespace std;
int main() {
int n, m, a[10005][10005], x = 1, y = 0;
cin >> n >> m;
for (int i = 1; i <= n * m;) {
while (y < m && !a[x][y + 1])//1+1<3 故可走
a[x][++y] = i++;
//cout << a[x][y] << endl;
while (x < n && !a[x + 1][y])
a[++x][y] = i++;
while (y > 1 && !a[x ][y - 1])
a[x][--y] = i++;
while (x > 1 && !a[x - 1][y])
a[--x][y] = i++;
//cout << a[x - 1][y] << endl; //判断是否回到了已走行数
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
printf("%d ", a[i][j]);
}
cout << endl;
}
return 0;
}
注:如果初次看不出,建议如源码中 //cout << a[x - 1][y] << endl; //判断是否回到了已走行数 进行数据跟踪,更便于理解。