輸出一螺旋矩陣。
輸入說明 :
每行有一正整數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