在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 尋路
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹(shù)的保存和加載
圖添加和刪除
排序二叉樹(shù)線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹(shù)深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹(shù)
大數(shù)計(jì)算
二叉樹(shù)廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫(xiě)
哈夫曼樹(shù) 下
線性堆棧
八皇后
排序二叉樹(shù)刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹(shù) 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹(shù)
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹(shù)插入
圖的保存
排序二叉樹(shù)刪除-2
排序二叉樹(shù)刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

尋路

尋路是游戲設(shè)計(jì)中需要使用到一種功能,那么我們?cè)趺礃右砸粋€(gè)點(diǎn)作為起始點(diǎn),快速地尋找到目標(biāo)點(diǎn)呢?其實(shí)尋路的方法不難。一種簡(jiǎn)單有效的方法就是回溯法。如果我們從一個(gè)點(diǎn)出發(fā),那么這個(gè)點(diǎn)周圍肯定有若干條路,只要有一條路存在,我們就一直走下去,直到發(fā)現(xiàn)沒(méi)有路走為止;要是發(fā)現(xiàn)路走不下去了怎么辦,那就只好回頭了,我們只能從剩下的選項(xiàng)中繼續(xù)選擇一條路,繼續(xù)嘗試。如果很不幸,所有的嘗試都結(jié)束了,還是沒(méi)有發(fā)現(xiàn)目標(biāo)節(jié)點(diǎn),那只能說(shuō)明,我們真的無(wú)路可走。

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

#define MAX_NUMBER_LENGTH 6

static int gPath[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] = {
    {0 , 0, 0, 0, 1, 1},
    {1,  1, 0, 0, 1, 0},
    {0 , 1, 1, 1, 1, 0},
    {0 , 0, 1, 0, 1, 2},
    {0 , 0, 1, 0, 1, 0},
    {0 , 0, 1, 1, 1, 0}
};

static int gValue[MAX_NUMBER_LENGTH][MAX_NUMBER_LENGTH] = {0}; /* 記錄已走過(guò)的路 */

b)其實(shí),我們編寫(xiě)一個(gè)判斷函數(shù),判斷當(dāng)前節(jié)點(diǎn)是否合法

int check_pos_valid(int x, int y)
{
    /* 節(jié)點(diǎn)是否出邊界 */
    if(x < 0 || x>= MAX_NUMBER_LENGTH || y < 0 || y >= MAX_NUMBER_LENGTH)
        return 0;

    /* 當(dāng)前節(jié)點(diǎn)是否存在路 */
    if(0 == gPath[x][y])
        return 0;

    /* 當(dāng)前節(jié)點(diǎn)是否已經(jīng)走過(guò) */
    if('#' == gValue[x][y])
        return 0;

    return 1;
}

c)接著,我們編寫(xiě)一個(gè)遞歸的尋找算法即可

int find_path(int x, int y)
{
    if(check_pos_valid(x,y))
    {
        if(2 == gPath[x][y]){
            gValue[x][y] = '#';
            return 1;
        }

        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)為了驗(yàn)證我們的算法是否正確,可以編寫(xiě)一個(gè)打印函數(shù)

void print_path()
{
    int outer;
    int inner;

    for(outer = 0; outer < MAX_NUMBER_LENGTH; outer++){
        for(inner = 0; inner < MAX_NUMBER_LENGTH; inner++){
            printf("%c ", gValue[outer][inner]);
        }
        printf("n");
    }
}

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

void find_path(int x, int y)
{
    if(check_pos_valid(x,y))
    {
        if(2 == gPath[x][y]){
            gValue[x][y] = '#';
            print_path();
            gValue[x][y] = 0;
            return ;
        }

        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;
    }
}

思考題:

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