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;
    }
}