1. 程式人生 > >1105 Spiral Matrix

1105 Spiral Matrix

++ spi 序列 ima tdi 忘記 設置 方便 namespace

題意:給出含N個數的序列,要求把這N個數按從大到小的順序順時針填入m*n的矩陣中,m,n需滿足m*n=N,同時m>=n且m-n盡量小。

思路:我是按如下的方式,先從左往右把第1層填滿,然後從第2層到倒數第2層把最右側填滿。。。

技術分享圖片

然後設置flag來標記當前是第幾圈,因為每一圈上下左右邊界是變化的,如第一圈從左到右的邊界是[0,n-1],第二圈(如果有的話)則是[1,n-2],用這個flag方便控制邊界的變化,具體的看看代碼,手動模擬即可。

註意:在for循環內不要忘記加idx<cnt進行控制!如3*1這種只有一列矩陣,不需要走完4個for循環就已經填滿了。

代碼:

#include <cstdio>
#include 
<cmath> #include <algorithm> using namespace std; const int N=10005; int data[N]; int matrix[100][100];//這個大小是隨便定的,然後就過了。。。說明PAT的樣例不夠多啊 bool cmp(int a,int b){ return a>b; } int main() { //freopen("pat.txt","r",stdin); int cnt,m,n;//m行n列 scanf("%d",&cnt); m=sqrt(cnt);
while(cnt%m!=0) m--; n=cnt/m; if(m<n) swap(m,n); for(int i=0;i<cnt;i++) scanf("%d",&data[i]); sort(data,data+cnt,cmp); int flag=0,idx=0; while(idx<cnt){ for(int col=flag;col<n-flag && idx<cnt;col++) matrix[flag][col]=data[idx++];
for(int row=flag+1;row<m-1-flag && idx<cnt;row++) matrix[row][n-1-flag]=data[idx++]; for(int col=n-1-flag;col>=flag && idx<cnt;col--) matrix[m-1-flag][col]=data[idx++]; for(int row=m-2-flag;row>=flag+1 && idx<cnt;row--) matrix[row][flag]=data[idx++]; flag++; } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ printf("%d",matrix[i][j]); if(j<n-1) printf(" "); else printf("\n"); } } return 0; }

1105 Spiral Matrix