#11928:


nkavengertree (LaG)

學校 : 不指定學校
編號 : 62501
來源 : [49.216.191.28]
最後登入時間 :
2021-11-21 03:06:49
a417. 螺旋矩陣 | From: [163.30.20.150] | 發表日期 : 2017-04-20 09:58

 還在想有沒有比較好的方式繞出陣列


#include <iostream>
#include <iomanip>
using namespace std;

const int MSIZE=101;
unsigned int T,N,M,index,m[MSIZE][MSIZE];
int way[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

//清空所有陣列
void clear(){
  for(int i=1;i<=N;i++)
    for(int j=1;j<=N;j++)
      m[i][j]=0;
}
//判斷是否超出範圍
bool check(int i,int add){
  if (i+add<1||i+add>N)
    return false;
  return true;
}
//判斷是否已經使用過
bool isUsed(int x,int y){
  if(m[y][x]==0)
    return false;
  return true;
}
//寫入陣列
void writein(int x,int y,int count){
  count++;//當前位置計算;
  m[y][x]=count;//給數字;
  if(count==N*N){
    return;//飽和;
  }
  if(M==1){
  //判斷X,Y範圍正常 && 未使用過;
    if(check(x,way[index][0]) && check(y,way[index][1]) && !isUsed(x+way[index][0],y+way[index][1])){
      writein(x+way[index][0] , y+way[index][1] , count);
    }
    else{
      index=(index+1)%4;
      writein(x+way[index][0] , y+way[index][1] , count);
    }
  }
  else{
    //判斷X,Y範圍正常 && 未使用過;
    if(check(x,way[index][1]) && check(y,way[index][0]) && !isUsed(x+way[index][1],y+way[index][0])){
      writein(x+way[index][1] , y+way[index][0] , count);
    }
    else{
      index=(index+1)%4;
      writein(x+way[index][1] , y+way[index][0] , count);
    }
  }
}
//輸出陣列
void show(){
  for(int i=1;i<=N;i++){
    for(int j=1;j<=N;j++){
      cout << setw(5) << m[i][j];
    }
  cout << endl;
  }
}
int main()
{
  cin>>T;
  while(T--){
    cin>>N>>M;
    index=0;
    clear();
    writein(1,1,0);
    show();
  }
  return 0;
}

 
ZeroJudge Forum