乙個走迷宮的程式

2021-06-06 15:28:50 字數 3245 閱讀 1559

本文給出乙個c語言版的走迷宮的程式。迷宮的寬和高,迷宮矩陣,迷宮的入口和出口從檔案讀入。程式首先讀入迷宮資料,然後顯示迷宮矩陣,最後呼叫迷宮搜尋程式找到乙個路徑,並輸出。

1. 迷宮的表示。

迷宮用結構體matrix來表示

包括迷宮矩陣

迷宮的寬,迷宮的高,

迷宮入口的座標,迷宮出口的座標。

結構體定義如下:

typedef struct _step

step;

typedef struct _matrix

matrix;

迷宮矩陣的每乙個元素可以是0或1,0表示可走,1表示是牆,走不通。

為了便於檢查是否越界,即座標超過迷宮的範圍。在迷宮的4個邊增加了全1資料,表示4堵牆,這樣,在任何時候,都不會越界。下面的資料表示1個5×5的迷宮,增加了4堵牆後,實際寬度和高度變為7,迷宮變成1個7×7的矩陣

1, 1, 1, 1, 1, 1, 1,

1, 0, 0, 0, 0, 0, 1,

1, 1, 0, 1, 0, 1, 1,

1, 0, 0, 1, 1, 1, 1,

1, 0, 1, 0, 0, 0, 1,

1, 0, 0, 0, 1, 0, 1,

1, 1, 1, 1, 1, 1, 1,

2.演算法

走迷宮的路徑的每一步可用二元組(x,y)來表示。已經走過的路徑放入陣列path。

首先,將入口的座標放入陣列,此時path陣列的元素個數為1.

接下來使用下面的規則,試圖找到一條出路

1. 從當前位置(即陣列的最後乙個元素),從右,下,左,上四個方向搜尋,看能否走通。

如果可找到一條通路,則

將新的位置的座標放入path陣列,陣列長度加1. 

如果新的位置的座標等於出口的座標,搜尋結束。

如果從各個方向都走不通,則

將迷宮當前位置的元素置為1,這樣,當前點就變成牆,下次就不會走到這個位置了。並將陣列的最有乙個元素丟棄,陣列長度減1

如果陣列的長度為0,沒有任何路徑可以走通,搜尋結束。

全部的**見下:

#include #include #include #include #define max_width    30

#define max_height 30

typedef struct _step

step;

typedef struct _matrix

matrix;

matrix g_matrix= //初始化為乙個迷宮,程式也能從檔案中讀入迷宮資料

, ,

, ,

, ,

, },

7,7, //7行,7列,包括4堵牆

, //入口座標

//出口座標

};static step s_shift=

, //向右走, x++, y 不變

, //向下走, x 不變, y++

, //向左走, x--, y不變

//向上走, x 不變, y--

};void print_paths(step path,int path_len) //列印走迷宮的路徑

}void print_matrix(matrix* pmatrix) //列印迷宮資料,迷宮資料報含4堵牆

printf("\n"); }}

int search_path(int matric[max_width+2][max_width+2],

step path,int path_len,step exit)

}// path[path_len-1]表示當前位置,path[path_len-2]表示上一步的位置,

// 如果新的位置等於上乙個位置,將陷入迴圈,故要求新的位置不能是上一步的位置

else if ( (newpos.x != path[path_len-2].x || newpos.y!=path[path_len-2].y) && g_matrix.data[newpos.x][newpos.y]==0)

}if (bfind)

else

}}int readmatrix(char *file)

memset(&(g_matrix),0,sizeof(g_matrix));

fgets(line,sizeof(line)-1,fp);

sscanf(line,"%d %d",&x,&y); //讀入迷宮的行數和列數

if ( x>max_width || y>max_height)

g_matrix.width=x+2; //在4條邊增加4堵牆,故寬和高增加2

g_matrix.height=y+2;

for (j=0;j='0' && *p<='9')

if (j>=g_matrix.width-2)

break;

} }fgets(line,sizeof(line)-1,fp);

//讀入入口的行座標和列座標,和出口的行座標,列座標

sscanf(line,"%d %d %d %d",&(g_matrix.entrance.x),&(g_matrix.exit.y),&(g_matrix.exit.x),&(g_matrix.exit.y));

fclose(fp); fp=null;

g_matrix.entrance.x++; //增加了一列是牆,故入口橫座標+1

g_matrix.entrance.y++; //增加了一行是牆,故入口縱座標+1

g_matrix.exit.x++; //增加了一列是牆,故入口橫座標+1

g_matrix.exit.y++; //增加了一列是牆,故入口縱座標+1

return 1;

}int main()

printf("the matrix is\n");

print_matrix(&g_matrix);

path[0]=g_matrix.entrance; //將入口位置放入path陣列

step_count = search_path(g_matrix.data,path,1,g_matrix.exit); //查詢一條路徑,路徑的每一步的座標放入path陣列

if (step_count>0) //找到一條出路,步數》0

else //步數<=0, 沒有找到出路

printf("no solution\n");

return 0;

}

乙個老鼠走迷宮問題的python解法

今天在查詢馬爾科夫鏈的過程中,在網上看到乙個有意思的問題,於是用python將其做了實現和改進,題目如下 如下圖所示的迷宮共有9個格仔,相鄰格仔有門相通,9號格仔就是迷宮出口.整個迷宮將會在5分鐘後坍塌.1號格仔有乙隻老鼠,這只老鼠以每分鐘一格的速度在迷宮裡亂竄 它通過各扇門的機會均等 求此老鼠在迷...

UESTC 853 乙個簡單的走迷宮問題

這是乙個網格迷宮問題,地圖的左上角為 0 0 座標 i j 表示 i 行 j 列。有乙個人,他在乙個迷宮裡,他要去乙個目標位置。他站在網格的交叉點上,障礙物在網格內部。他可以用不同的速度前進,每秒可以走 1 格到 3 格。也可以花費一秒的時間向左或向右轉。同時他不能撞到障礙物,也不能半個身體在地圖外...

程式設計題走迷宮 C 程式演算法題 迷宮(一)

題目 一天蒜頭君掉進了乙個迷宮裡面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。看在蒜頭君這麼可憐的份上,就請聰明的你告訴蒜頭君是否有可以逃出去的路。輸入格式 第一行輸入兩個整數 n和 m,表示這是乙個 n m的迷宮。接下來的輸入乙個 n行 m列的迷宮。其中 s 表示蒜頭君的位置,...