a417
輸入說明 :
每行有一正整數T,代表有幾組測試資料
接下來有T行, 每行有N、M兩正整數
N為矩陣長寬,就是會有N*N矩陣
M為方向,M=1為順時鐘,M=2為逆時鐘
N範圍為1~100之間
輸出說明 :
把矩陣輸出,矩陣值之間寬度為5,就是[00000]寬度
C++可用setw(5)或C的%5d輸出
陣列宣告成a[102][102]多出來的2,是要當上下左右的牆壁,把牆壁設成-1
順時針就是 右 下 左 上 的走,一個方向走到底才換另一個方向,走過的路就記起來 變成牆壁
逆時針就是 下 右 上 左 的走
每走一步就判斷下一步會不會撞到牆壁,會的話就換方向
if(u[row+1][col]==-1&&u[row][col+1]==-1&&u[row-1][col]==-1&&u[row][col-1]==-1)
上面這個是拿來判斷,是不是終點,因為終點上下左右都回變成牆壁
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int drow[]={0,1,0,-1} , dcol[]={1,0,-1,0}; //右下左上
int rdrow[]={1,0,-1,0},rdcol[]={0,1,0,-1}; //下右上左
void clock(int row,int col,int n);
void rclock(int row,int col,int n );
int a[102][102];
int u[102][102];
int main()
{
int t;
scanf("%d",&t);
int n,m;
while(t--)
{
scanf("%d %d",&n,&m);
memset(u,-1,sizeof(u));
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
u[i][j]=0;
if(m==1)
clock(1,1,n);
else
rclock(1,1,n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
puts("");
}
}
return 0;
}
void clock(int row,int col,int n)
{
int num=1;
int d;
while(num<n*n)
{
for(d=0;d<4;d++)
{
while(u[row+drow[d]][col+dcol[d]] == 0)
{
a[row][col]=num;
u[row][col]=-1;
row+=drow[d];
col+=dcol[d];
num++;
}
}
if(u[row+1][col]==-1&&u[row][col+1]==-1&&u[row-1][col]==-1&&u[row][col-1]==-1)
a[row][col]=num;
}
}
void rclock(int row,int col,int n )
{
int num=1;
int d;
while(num<n*n)
{
for(d=0;d<4;d++)
{
while(u[row+rdrow[d]][col+rdcol[d]] == 0 )
{
a[row][col]=num;
u[row][col]=-1;
row+=rdrow[d];
col+=rdcol[d];
num++;
}
}
if(u[row+1][col]==-1&&u[row][col+1]==-1&&u[row-1][col]==-1&&u[row][col-1]==-1)
a[row][col]=num;
}
}