描述:
在一个N*N的方阵中,填入1,2,……N*N个数,并要求构成如下的格式:
例如:
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)可以看出是从方阵的右上角的1开始,即将a [ 1 ] [ N ] 初始化为1。初始循环时令i=1; j=N;
依次向下,向左,向上,向右走,重复这四个过程。则需要四个循环来分别控制向下,向左,向 上,向右。 且下一个值=上一个值+1
(2)下一步是判断四个循环时的条件:共有N行N列,则向下走的终止条件是i<N,向左走的终止条件是j>1,向上走的终止条件是i>1,向右走的终止条件是j<N。因为所有数据都已初始化为0,想要填入数据且a [ i ] [ j ]不能被重复填入,则只有a [ i ] [ j ]的下一个值 为0时才进行循环填入数据。
while((i<N)&&a[i+1][j]==0) //向下走
{
a[i+1][j]=++tot;
i++;
}
(3)下面判断四个循环的终止条件:循环1次,数值加1。当数值为N*N时跳出循环,即需要定义一个变量tot为1,当tot>N*N时跳出循环,因为a [ 1 ] [ N ]已经被定义过了,所以只要循环N*N-1次,且从a [ 2] [ N ]开始循环即可。
代码如下:
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
int a[25][25]={0};
int i=1,j=N,tot=1;
a[1][N]=1;
while(tot<N*N)
{
while((i<N)&&a[i+1][j]==0) //向下走
{
a[i+1][j]=++tot;
i++;
}
while((j>1)&&(a[i][j-1]==0)) //向左走
{
a[i][j-1]=++tot;
j--;
}
while((i>1)&&(a[i-1][j]==0)) //向上走
{
a[i-1][j]=++tot;
i--;
}
while((j<N)&&(a[i][j+1]==0)) //向右走
{
a[i][j+1]=++tot;
j++;
}
}
for(i=1;i<=N;i++) //输出数据
{
for(j=1;j<N;j++)
{
printf("%d ",a[i][j]);
}
printf("%d",a[i][j]);
printf("\n");
}
return 0;
}