小白养成记 (6)------方形填数

描述:

在一个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;
 }
发布了17 篇原创文章 · 获赞 19 · 访问量 626

猜你喜欢

转载自blog.csdn.net/So_cute_SJM/article/details/103285027
今日推荐