算法:蛇形矩陣

偶然看到蛇形矩陣的算法題,覺得比較有趣,想了想,解出來了,并且對算法有了一個新的感知,先看看題目吧,后面談談對算法的感知。


輸出如下:

1   3   4   10
2   5   9   11
6   8   12  15
7   13  14  16

解題思路:

  1. m*n的矩陣,一一填入數(shù)字,
  2. 數(shù)字填在哪一行哪一列,用x/y來表示,填入之后,計算下一次填入的位置
  3. 填入方向有向右上,有向左下,需要有一個值來標記方向

所以需要有:

/*
  m、y:有m行n列
  x、y:填x行第y個
  right:是否向右上 1:右上 0:左下
*/
let m = n = 4;
let x = y = 1;
let right = 0;
let arr = [];
for (let i = 0; i < m; i++) {
  arr[i] = [];
}

需要思考的:
填入有右上、左下的方向,什么時候改變填入的方向?
邊緣位置,x=1、x=m、y=1、y = n 的時候。

所以循環(huán)代碼如下:

for (let i = 1; i <= m * n; i++) {
  // 填充數(shù)據(jù)
  arr[x - 1][y - 1] = i;

  if (right) {
    if (x === 1 || y + 1 > n) {
      // 邊緣時改變方向
      right = 0;
      if (y + 1 > n) {
        // 最右處則填入下一行
        x++;
      } else {
        // 非最右處則填入下一列
        y++;
      }
    } else {
      x--;
      y++;
    }
  } else {
    if (y === 1 || x + 1 > m) {
      // 邊緣時改變方向
      right = 1;
      if (x + 1 > m) {
        // 最底處則填入下一列
        y++;
      } else {
        // 非最底處則填入下一行
        x++;
      }
    } else {
      x++;
      y--;
    }
  }
}

其實弄清楚什么時候轉換方向,就很好理解了。

題目解析結束,談談自己的感悟吧。


本來還在想,怎么算,要不要找公式,后來自己在本子上寫了一下,突然發(fā)現(xiàn),算法的過程就是將自己寫的過程總結,人在寫這個的時候,會去想,下一個從哪里開始,寫到哪一個上面,而為什么要換個方向,只不過這些邏輯,你因為圖形界面,直接就填入了,而電腦沒有這個概念,只能用代碼把邏輯寫下了,然后進行計算。

所以歸根到底,算法是把人腦子里想法的具體化,用代碼來展示你是怎么想的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容