一步一步寫演算法(之尋路)

2021-08-26 07:43:39 字數 1615 閱讀 7860

尋路是遊戲設計中需要使用到一種功能,那麼我們怎麼樣以乙個點作為起始點,快速地尋找到目標點呢?其實尋路的方法不難。一種簡單有效的方法就是回溯法。如果我們從乙個點出發,那麼這個點周圍肯定有若干條路,只要有一條路存在,我們就一直走下去,直到發現沒有路走為止;要是發現路走不下去了怎麼辦,那就只好回頭了,我們只能從剩下的選項中繼續選擇一條路,繼續嘗試。如果很不幸,所有的嘗試都結束了,還是沒有發現目標節點,那只能說明,我們真的無路可走。

a)首先,我們用矩陣表示地圖:其中1表示路,0表示沒有路,2表示終點,起始地點為(1,0)

#define max_number_length 6

static int gpath[max_number_length][max_number_length] = ,

, ,, , };

static int gvalue[max_number_length][max_number_length] = ; /* 記錄已走過的路 */

b)其實,我們編寫乙個判斷函式,判斷當前節點是否合法

int check_pos_valid(int x, int y)

c)接著,我們編寫乙個遞迴的尋找演算法即可

int find_path(int x, int y)

gvalue[x][y] = '#';

if(find_path(x, y-1))

return 1;

if(find_path(x-1, y))

return 1;

if(find_path(x, y+1))

return 1;

if(find_path(x+1, y))

return 1;

gvalue[x][y] = 0;

return 0;

} return 0;

}

d)為了驗證我們的演算法是否正確,可以編寫乙個列印函式

void print_path()

printf("\n");

}}

e)上面c中所描述的演算法只是尋找一條路,那麼如果想遍歷所有的道路,演算法應該怎麼修改呢?

void find_path(int x, int y)

gvalue[x][y] = '#';

find_path(x, y-1);

find_path(x-1, y);

find_path(x, y+1);

find_path(x+1, y);

gvalue[x][y] = 0;

}}

思考題:

上面的題目介紹了尋路的方法,介紹了如何遍歷所有的可能路徑。當然你可以從這所有的尋找路徑中尋找出一條最短的路徑。但是朋友們可以思考一下,有沒有一種方法,可以一下子尋找到最優的路徑呢?

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法 之 A 演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...