螺旋方阵(Leetcode第59题)
問題描述:螺旋矩陣
#include <stdio.h> #include <memory.h> int main(){int n;scanf("%d",&n);int i, c = 0, r = 0,num = 0,cnt = n/2;int a[n][n];while (cnt--){for (i = r; i<n-c; i++) //→a[r][i] = num++;r++;for (i = r; i<n-c; i++) //↓a[i][n-c-1] = num++;c++;for (i = c-1; i<n-c; i++) //←a[n-r][n-i-2] = num++; // for (i = n - c; i >= r - 1; i--) //← // a[n-r][i] = ++num;//減減方法 // for (i = n - c - 1; i > r-1; i--) //↑ // a[i][c-1] = num++;for (i = r; i<n-r; i++) //↑a[n-1-i][c-1] = num++; } if(n%2 != 0) //如果是奇數,填上正中間那個數a[n/2][n/2] = num++;for (int i =0; i<n; i++){ //遍歷輸出for (int j =0; j<n; j++)printf("%3d",a[i][j]);printf("\n");} return 0; }思路:最開始我做題的想法不是這樣的,我最開始用的是二維數組去賦值(兩個for循環),因為輸出螺旋矩陣,是個二維的,所以最開始想的就是用兩個for循環,以至于思維受限,導致很久都沒有相出解決方法來。就只讓最外面的一層給按順序給排序好了,其他的就不對了。應該的思維是一次一次的排序,而不是兩個for循環的排序。具體方法請看代碼即可理解清楚。首先,因為要進行的螺旋排序不止一圈,所以要在一個while循環中進行,循環判斷的條件是方陣階數的二分之一,如果是奇數,那最中心的那個數是需要單獨賦值的,及最大值,如果是偶數直接排序即可。
思考如下幾個問題:①在進行向左和向上時只能用++的方式?,可以怎么改?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?②為什么我輸出的結果是0開始的?如果改?改的方式?
解決:①不止可以以++的方式,還可以--的方式,在慣性思維里用的是--的方式,但是這里用--的方式的話,它的判斷條件就不一樣了,這里需要仔細考慮。
? ? ? ? ?當減減時就是從最右邊開始往左減減,一直減到第一個,也就是第0列的位置,判斷停止,向上也是同樣的判斷,但是最后到達的地方的判斷的條件不一致,這里需要思考一下(因為第0行已經有數了,所以不能取等號),減減的方式也附上了。
? ? ? ②輸出是0開始是因為最開始的初始值為0,有兩個方法可以解決此問題,第一個也是最簡單的,就是把初始值賦值為1開始,第二個方法是num++變成++num,這個一般很少想得到,這里又涉及到了另一個知識點,可以復習一下。
關于++i和i++的區別,可參考以下博主:https://blog.csdn.net/Cs_ChenSh/article/details/79955638
強調:本題的關鍵還有一點是循環的判斷條件,也就是沒次for循環的終止點在哪,下一次的開始點是那,這要搞清楚,不然會重復和亂,堅持一種原則即可
例如:左閉右開,如下圖(這點很關鍵,再次強調)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
?
?
總結
以上是生活随笔為你收集整理的螺旋方阵(Leetcode第59题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse C/C++环境搭建
- 下一篇: java程序课程总结_Java课程总结报