1. 程式人生 > >ACM題 蛇形矩陣

ACM題 蛇形矩陣

/*
題目:
在n*n方陳裡填入1,2,...,n*n,要求填成蛇形。例如n=4時方陳為:
10 11 12 1
9  16 13 2
8  15 14 3
7  6  5  4
整體思路:
設函式為row;
例如:row = 4;
蛇形矩陣尾:
10 11 12 1
9  16 13 2
8  15 14 3
7  6  5  4
對應的座標位置為:
(0,0)(0,1)(0,2)(0,3)
(1,0)(1,1)(1,2)(1,3)
(2,0)(2,1)(2,2)(2,3)
(3,0)(3,1)(3,2)(3,3)
每次是從第1行的第row列開始是即使陣列的[0][row-1]開始實現蛇形矩陣
1.蛇首先是先向下移動(行加一列不變),一直移動到下一個位置不為零(表示該位置被蛇的其他部分佔用)或者到row行的時候
2.再向左移動(行不變列減一),一直移動到下一個位置不為零(表示該位置被蛇的其他部分佔用)或者到0列的時候
3.再向上移動(行減一列列不變),一直移動到下一個位置不為零(表示該位置被蛇的其他部分佔用)或者到0行的時候
4.最後向右移動(行不變列加一),一直移動到下一個位置不為零(表示該位置被蛇的其他部分佔用)或者到row列的時候
5.然後蛇向下移動一個位置(行加一列不變),從第1步開始繼續執行,共執行row次

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    int *a;
    int row,tmp_row;
    int num = 1;
    int i,j;
    int loc;
    scanf("%d",&row);
    i =0 ;
    j = row -1;
    tmp_row = row;
    a = (int *) malloc (row*row*sizeof(int));
    memset (a, 0, row*row*sizeof(int));
    while( tmp_row ){        
        //蛇向下移動。
        while ( i < tmp_row){    //判斷蛇是否在可用的行內。不符和條件,證明本方向移動結束
                 loc = i* row +j;     
                 if (  *(a + loc) ) { i--;break;}//判斷位置是否已經被蛇佔用了,佔用,證明本方向移動結束
                 *(a +loc) = num++;
                  i++;//對行數加一,移動到下一個位置
        }
        if ( i >= tmp_row ) i--;//如果移動出可用行,返回行內
    j--;//因為返回的位置,此位置已經被使用過。通過j--修正到正確的位置,下面同理
        while ( j >=0){
            loc = i* row +j;     
            if (  *(a + loc) ) { j++;break;}
            *(a +loc) = num++;
            j--;       
        }
        if (j < 0) j++;
    i--;
        while ( i >=0){
           loc = i* row +j;     
           if (  *(a + loc) ) { i++;break;}
           * (a +loc) = num++;
           i--;       
        }
        if (i < 0) i++;
        j++;
           while ( j <tmp_row){
            loc = i* row +j;     
            if (  *(a + loc) ) { j--;break;}
            * (a +loc) = num++;
            j++;       
        }
    i++;
        tmp_row--;
    }
    loc = 0 ;
    for (i = 0; i < row; i++){
        for (j = 0; j < row; j++){
           printf("%d ",* (a+loc));
            loc ++;     
         }
        printf("\n");    
    }
}