題目有點難,ok其實是很難。。。
觀察樣例輸出,不難發現,螺旋數組中元素的遞增軌跡為:右右右、下下下、左左左、上上上
?簡明為:右、下、左、上。可以設開始遞增的元素1的位置為(x,y),那么右的運行軌跡就是:(x,y+1),下就是:(x+1,y),左則是:(x,y-1),上則是:(x-1,y)。則定義兩個變量分別表示元素所在位置:x,y;由于螺旋數組中的每一個元素都是一次遞增的每次都加1,那么即可定義數組a[x][y],讓這個數組等于m,而m每次都要加1。
int n,m,x,y,t,a[19][19];scanf("%d",&n);m=1;x=1;y=1;x=1;
我們的代碼中右一個t變量,它的作用是:判斷方向;還有一個細節,為了不讓螺旋數組已知旋下去,m雖然也一次累加但大小不能超過m*m。當m<=m*m的時候才執行:右右右、下下下、左左左、上上上,這些操作。可以想到用while循環來解決。
while(m<=n*n){a[x][y]=m;m++;if(t==1){//右if(a[x][y+1]>0||x>n||y+1>n||x<1||y+1<1){t++;}}if(t==2){//下if(a[x+1][y]>0||x+1>n||y>n||x+1<1||y<1){t++;}}if(t==3){//左if(a[x][y-1]>0||x>n||y-1>n||x<1||y-1<1){t++;}}if(t==4){//上if(a[x-1][y]>0||x-1>n||y>n||x-1>1||y<1){t++;}}if(t>4){t=1;}if(t==1){y++;}if(t==2){x++;}if(t==3){y--;}if(t==4){x--;} }
然后拼裝:(成就AC)
#include<cstdio>
int n,m,x,y,t,a[19][19];
int main(){scanf("%d",&n);m=1;x=1;y=1;t=1;while(m<=n*n){a[x][y]=m;m++;if(t==1){if(a[x][y+1]>0||x>n||y+1>n||x<1||y+1<1){t++;}}if(t==2){if(a[x+1][y]>0||x+1>n||y>n||x+1<1||y<1){t++;}}if(t==3){if(a[x][y-1]>0||x>n||y-1>n||x<1||y-1<1){t++;}}if(t==4){if(a[x-1][y]>0||x-1>n||y>n||x-1<1||y<1){t++;}}if(t>4){t=1;}if(t==1){y++;}if(t==2){x++;}if(t==3){y--;}if(t==4){x--;}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%3d",a[i][j]);}printf("\n");}
}
交給讀者細品,(發現我很喜歡說啊)。。。。