這是一道大約15年這個時候我去某b開頭的網際網路公司面試時的一道基礎演算法題,其描述是有乙隻小老鼠,假設其在(x,y)點,它的初始方向為y軸負半軸,它不能碰到x,y軸,也不能與自己走過的路徑重合。並且其所走的所有座標點必須<=(x,y),求它走過的路徑和最終停在哪個點。
當時我並沒有在限定時間解出這道題,如今在做bfs迷宮演算法題時突然看到了兩者存在某種一致性(當然本題更簡單,並不需要用到bfs),勾起了陳年舊事,便一解以了。
其實本題最重要的思路有三點
1. 利用二維陣列解座標問題
這裡需要注意的是,二維陣列的行其實在數學一般座標系中是y軸,其列是x軸。然而直觀上又會有行是x軸列是y軸的印象。從前我經常邊做邊在心裡置換,一會就把自己搞混亂了。其實座標系只是相對的(相同的座標值可以根據自己的偏好做出不同的座標系,而其結果其實是相同的),即你可以直觀地把行看成x,列看成y,只要你在作圖的時候也按照這個概念,將x軸做成y,y軸做成x就可以了,需要注意的是,為了更加直觀,可以取第四象限為作圖起始。
2. 本題存在乙個退出條件,即上下左右四個點都已經是visited,這樣便需要在定義陣列的時候多定義一行一列。其實用二維陣列解座標問題,本身就需要多定義一行一列(如果座標點是(3,5),那麼x有0,1,2,3四個數,需要四行存放),而本題中需要更多地定義一列(即如果座標點是(3,5),陣列應該是(3+2,5+2),否則在判斷邊界點時判斷語句會因為陣列溢位而報錯。在初始化時需要將邊界全部置為已經訪問過的點(這些點本來就是不能觸碰的)
3. 命名要有明確的含義,要直觀,而不要繞彎。比如定義boolean visited陣列存放各個點的訪問情況,如果已經訪問了該節點,則置為true,如果還未訪問,就是初始值false。雖然否定之否定是肯定,但如果命名為unvisited,再把結果倒置,實在是麻煩了自己也麻煩了程式。(t_t這就是我最初的做法,自己把自己搞凌亂了)
以上就是我做這道題的時的感悟了
public class loopfor (int i = 0; i < 5; i++)
int dir = , , , };
system.out.println("visit:(" + x + ", " + y + ")");
visited[x][y] = true;
while (x >= 1 && x <= n && y >= 1 && y <= m
&& (!visited[x + dir[0][0]][y + dir[0][1]] || !visited[x + dir[1][0]][y + dir[1][1]]
|| !visited[x + dir[2][0]][y + dir[2][1]] || !visited[x + dir[3][0]][y + dir[3][1]]))
}} system.out.println("the final point is:(" + x + ", " + y + ")");
}}
C 貪吃蛇自噬
這篇 基於博主的 c 貪吃蛇基本演算法 通過加入另乙個二維陣列maps以用來儲存蛇身的 並通過簡單的遞迴演算法在蛇自噬時清除蛇的後半部分,並且修復了一些原來沒發現的bug。include include include include include include using namespace ...
C 貪吃蛇基本演算法
include include include include include using namespace std int error char x,char y 糾正強行自噬 int pos long x,long y setconsolecursorposition direct,pos 改...
貪吃蛇的演算法分析
貪吃蛇是一款非常經典的手機遊戲。它有很多演算法,這裡詳細分析一種比較優秀的演算法。首先介紹下主要用到的七個類 lwormmain 最主要的類,控制所有其它類的執行和銷毀。lwormpit 處理鍵盤輸入事件並例項化worm類和wormfood類的。lworm 抽象了貪吃蛇的屬性和動作 lwormfoo...