ACM題 蛇形矩陣
阿新 • • 發佈:2019-02-06
/*
題目:
在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次
題目:
在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"); } }