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