輸出一螺旋矩陣。
輸入說明 :
每行有一正整數T,代表有幾組測試資料
接下來有T行, 每行有N、M兩正整數
N為矩陣長寬,就是會有N*N矩陣
M為方向,M=1為順時鐘,M=2為逆時鐘
N範圍為1~100之間
輸出說明 :
把矩陣輸出,矩陣值之間寬度為5,就是[00000]寬度
C++可用setw(5)或C的%5d輸出
範例輸入 :
2
3 1
2 2
範例輸出 :
1 2 3
8 9 4
7 6 5
1 4
2 3
程式碼 :
#include<stdio.h> #include<stdlib.h> int main() { int i,j,t,n,m,x,y,loop,times,mode,count; int pathx[4] = {1,0,-1,0}; int pathy[4] = {0,-1,0,1}; while(scanf("%d",&t)==1) { while(t--) { scanf("%d%d",&n,&m); int **arr = (int**)malloc(sizeof(int *) * n); for(i=0; i<n; i++) arr[i] = (int*)malloc(sizeof(int) * n); count = 0; loop = (n-1) * 2; times = n; mode = 0; if(m == 1) { x = 0; y = -1; for(i=0; i<n; i++) { y = y + 1; arr[x][y] = ++count; } } else { x = -1; y = 0; for(i=0; i<n; i++) { x = x + 1; arr[x][y] = ++count; } } for(i=0; i<loop; i++) { if(i%2 == 0) times--; for(j=0; j<times; j++) { if(m == 1) { x = x + pathx[mode]; y = y + pathy[mode]; } else { x = x + pathy[mode]; y = y + pathx[mode]; } arr[x][y] = ++count; } mode = (mode+1) % 4; } for(i=0; i<n; i++) { for(j=0; j<n; j++) printf("%5d",arr[i][j]); printf("\n"); } if(t != 0) printf("\n"); } } return 0; }
http://zerojudge.tw/ShowProblem?problemid=a417