题目信息:
方形填数
描述
在一个NN的方阵中,填入1,2,……NN个数,并要求构成如下的格式:
例如:
N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
输入
每个测试文件只包含一组测试数据,每组输入一个N。(1<=N<=20)
输出
输出构成的方阵,每个数字之间只有一个空格,行首,行末没有空格。
输入样例 1
5
输出样例 1
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
题目链接:http://39.105.150.169/contest/11/problem/A;
题目分析:数组用来解决与整数相关的问题时,通常是通过数组的下标来解决问题。通过观察题目样例不难发现。数字首先在首行的最后一列开始先向下移动,再向左移动,之后再向上移动,最后再往右移动。很显然这是一个循环,因此,我们可以通过数组的下标来控制数字的移动方向。
#include<iostream>
using namespace std;
int arr[25][25];
int j = 1;
int main()
{
int n;
cin>>n;
int x = 0;
int y = n - 1;
arr[x][y] = j;
while(j < n * n) // 当j = n * n时,说明赋值完成
{
while(x + 1 < n && !arr[x + 1][y]) arr[++x][y] = ++j; // 向下移动,当到数组边缘,或者下一位已经赋值,结束循环
while(y - 1 >= 0 && !arr[x][y - 1]) arr[x][--y] = ++j; // 向左移动,当到数组边缘,或者左一位已经赋值,结束循环
while(x - 1 >= 0 && !arr[x - 1][y]) arr[--x][y] = ++j; // 向上移动,当到数组边缘,或者上一位已经赋值,结束循环
while(y + 1 < n && !arr[x][y + 1]) arr[x][++y] = ++j; // 向右移动,当到数组边缘,或者右一位已经赋值,结束循环
}
for(int i = 0; i < n; i++)
{
for(int k = 0; k < n; k++)
{
cout<<arr[i][k];
if(k != n - 1) // 最后一列之后,不在输出空格
cout<<" ";
}
if(i != n - 1) // 最后一行之后 ,不在输出换行
cout<<"\n";
}
}