小白養成記 (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;
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章