题目描述
输入两个整数 �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≤�,�≤100.1≤n,m≤100.
解题思想:
首先创建一个n*m的矩阵用以存放这个蛇形矩阵,那么,如何来存放这个矩阵呢,我们可以从样例中清楚的看出,最先存放的是第一行的m个从一开始的数,后面就需要从m列的第一行向n行存放m列中的n行数据,再就是从n行第m列至第一列存放数据,最后从第一列的n行向第一行存放数据,这里的数据可以设一个变量=1,每次操作都要加一,执行以上操作直至填满这个n*m矩阵。
代码:
#include<iostream>
using namespace std;
int a[110][110];
int main()
{
int x = 1, y = 0;
int sum = 1;
int n, m;
cin >> n >> m;
// 若 sum == n*m,则全部已经填完。
while(sum <= n*m)
{
// 先进行横向的填写
while(y < m && a[x][y+1] == 0)
{
a[x][y+1] = sum;
y++;
sum++;
}
// 进行纵向的遍历
while(x < n && a[x+1][y] == 0)
{
a[x+1][y] = sum;
x++;
sum++;
}
// 再进行从下往上的遍历
while(y > 1 && a[x][y-1] == 0)
{
a[x][y-1] = sum;
y--;
sum++;
}
// 再进行从左往右的遍历
while(x > 1 && a[x-1][y] == 0)
{
a[x-1][y] = sum;
x--;
sum++;
}
}
// 全部填完输出即可
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}