题目:
输入非负整数M,N;输出一个M行N列的矩阵;蛇形环,内容为A-Z;
示例:
例1:
输入:
3 2
输出:
A B
F C
E D
例2:
输入:
5 6
输出:
A B C D E F
R S T U V G
Q B C D W H
P A Z Y X I
O N M L K J
解析:
这题就不要尝试找坐标与元素的关系了,直接顺序填入即可。
这道题是蛇形环,元素的填入顺序的循环为:
自左向右-》自上向下-》自右向左-》自下向上
那如何实现这个填入顺序呢?我们需要“墙壁”的存在。
根据题意,我们可以得知:
1、当数组填入碰到数组长度界限时(即x>m或>n等)需要换向;
2、当数组下一个准备填入的元素已经存取了元素时,需要换向。
代码:
#include <iostream>
using namespace std;
//存取用数组
const int maxn = 2000;
int arr[maxn][maxn];
int main()
{
int n, m;
cin >> n >> m;
memset(arr, 0, sizeof(arr));
//作为循环跳出条件
int amount = n * m;
int i=0, j=0;
int count = arr[i][j]=1;
while(count<amount)
{
//填入顺序为:自左向右 - 》自上向下 - 》自右向左 - 》自下向上
//自左向右
while (j+1<m&&!arr[i][j+1])
{
arr[i][++j] = ++count;
}
//自上向下
while (i + 1 < n && !arr[i+1][j] )
{
arr[++i][j] = ++count;
}
//自右向左
while (j - 1 >=0 && !arr[i][j-1] )
{
arr[i][--j] = ++count;
}
//自下向上
while (i - 1 >=0 && !arr[i - 1][j] )
{
arr[--i][j] = ++count;
}
}
//输出
for(int a=0;a<n;a++)
{
for(int b=0;b<m;b++)
{
char ch = 'A' + (arr[a][b] - 1) % 26;
cout << ch << " ";
}
cout << endl;
}
return 0;
}