题目描述
在 n * n 的方阵里填入 1, 2, 3, ..., n * n, 要求填成以下蛇型. 例如, n = 4 的时候, 方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
上述中含有多余的空格,只为了方便观察规律,实际输出时保证每两个数之间仅存在一个空格.
输入格式
输入数据有多组,每组包含一个数字 n, (n <= 9).
输出格式
对于每组输入, 输出一个 n * n 的矩阵, 使得其中包含数字 1 ~ n * n, 并满足如题目所要求的形状.
输入样例 复制
4
输出样例 复制
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
##要注意多组输入 解法看注释 配合图片看更容易理解
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while (cin >> n)//多组输入
{
int a[15][15] = { 0 };//初始化数组
int i = 1, x = 1, y = n;//初始化变量
while (i <= n * n)//i每走一步加一,总个数小于矩阵数字个数
{
while (a[x][y] == 0 && x <= n)//当要填的位置为0(也就是没填过)且x比最大行数小时
{
a[x][y] = i;//将要填的位置填数
x++;//填下一行
i++;//总数加一
}
x--; y--;//因为运行完后x是5 所以减一并且将最右边的列数减一,进行下一轮填数
while (a[x][y] == 0 && y >= 1)//开始填最下面一排,当要填的位置为0(也就是没填过)且y(列数)没有填到最左边时
{
a[x][y] = i;//填数
y--;//将要填的列向左移
i++;//总数加一
}
y++; x--;//运行完上一轮后y为0 所以加一,将x-(行向上移)进行新一轮填数
while (a[x][y] == 0 && x >= 1)//当未填到最上面一行时
{
a[x][y] = i;//填数
x--;//将行向上移
i++;
}
x++; y++;
while (a[x][y] == 0 && y <= n)//同理 y没有到最大列数时填数
{
a[x][y] = i;
y++;
i++;
}
x++; y--;
}
for (int i = 1; i <= n; i++)//正常输出
{
for (int j = 1; j <= n; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
}