C語言 老鼠走迷宮 深度尋路演算法

2021-08-25 05:22:02 字數 4389 閱讀 2650

這個是學校的課設,剛開始有點頭疼,但是感覺越做越有意思了,於是就有如下**,可能相較於大佬還有差距,但是這是我目前所能做的最優的程式了吧!

話不多說,說一下**的核心內容吧!

迷宮是通過二維陣列構造的,二維組中的數字2代表牆體,0是通路,1是老鼠,3代表糧;

void game()  //走迷宮遊戲,包含時間統計,以及對老鼠的移動控制,遊戲模組;

void create_plat()   //新建地圖,並存入檔案的模組;檔案會儲存在程式同目錄下,地**件名是plat.txt;

void show_plat()   //地圖展示模組;

void alter_plat()    //修改地圖模組;

void read_plat()  //讀取檔案裡的地圖模組;在讀取地圖之前必須先含有該檔案(plat.txt);

void path_result(int p,int q)  //統計地圖的所有可能出現的路徑結果,並把次數賦給全域性變數answer,並在path_result函式中引用變數,作為遞迴終止和顯示最優解的條件;

void path_best(int p,int q,int l)     //顯示最優路徑的模組;

void path_find(int p,int q)  //尋找通關路徑的模組;

//全域性定義的變數

int m=4,n=4;            //老鼠的初始位置

int p=4,q=4;           //老鼠位置二次定位

int x=7,y=7;            //糧倉初始位置

int g,answer;            //g:統計有效路徑,防止路徑過多,造成迴圈過度;answer:統計該地圖的所有可能性;

這個**有一定的缺陷,因為自動尋路演算法是用深度遍歷,所以必須要統計全部結果,而且隨著地圖越來越空,得到的結果越來越多,運算的複雜度提公升將會浪費許多時間,我的是9x9的地圖,內部7x7如果全為空,則需要計算不止5億次,5億次是得到的結果這麼多,而且要引用變數,所以翻倍10億次運算的結果;本人親測花了6個小時的時間。所以該部分尋路演算法,是很大的缺陷,目前已找到解決辦法,深度優先是必須找到路最長的,而廣度優先是找到最短的就可以停止,所以不久之後我會再更新一篇部落格,用廣度優先實現自動尋路,相較於深度優先,會更加快速的找出最短路徑。

以下是源**:

大家可以自己試試,程式設計軟體vc6.0

#include #include #include#include#define m 9

#define n 9

int maze[m][n] = ,

, ,, ,

, , ,

};struct best //用於記錄最短路徑的結構體

best;

int m=4,n=4; //老鼠的初始位置

int p=4,q=4; //老鼠位置二次定位

int x=7,y=7; //糧倉初始位置

int g,answer; //g:統計有效路徑,防止路徑過多,造成迴圈過度;answer:統計該地圖的所有可能性;

void game() //走迷宮遊戲,包含時間統計,以及對老鼠的移動控制,遊戲模組

else if(maze[i][j]==1)

else if(maze[i][j]==3)

else

}printf("\n");

} printf("(按w↑s↓a← d→移動)\n請在15秒內通關☆(-o⌒)\n"); //初始化地圖

while(1)

else if(maze[m-1][n]==3)

}else if(str=='s') //下

else if(maze[m+1][n]==3)

}else if(str=='a') //左

else if(maze[m][n-1]==3)

}else if(str=='d') //右

else if(maze[m][n+1]==3)

}else;

system("cls");

printf("顯示迷宮:\n"); //顯示遊戲地圖

for (i = 0 ; i < m ; i++)

else if(maze[i][j]==1)

else if(maze[i][j]==3)

else

}printf("\n");

}printf("(按w↑s↓a← d→移動)\n請在15秒內通關☆(-o⌒) \n");

} else;

if(v==1) //判斷是否通關

if(t>15) //規定時間到後結束遊戲

end=time(null);

t=difftime(end,start); }}

void create_plat() //新建地圖,並存入檔案的模組

}} aa: printf("請設定老鼠的初始位置x,y即行列(1~%d,1~%d):\n",m-2,n-2);

//清除來自鍵盤的30多個快取字元,防止死迴圈bug

for(i=0;i<30;i++)

fflush(stdin);

scanf("%d,%d",&p,&q);

if(p<=(m-2)&&q<=(m-2)&&p>0&&q>0)

maze[p][q]=1;

else

bb: printf("請設定糧倉的位置x,y:\n");

//清除來自鍵盤的30多個快取字元,防止死迴圈bug

for(i=0;i<30;i++)

fflush(stdin);

scanf("%d,%d",&x,&y);

if(x<=(m-2)&&y<=(n-2)&&x>0&&y>0&&(x!=p||y!=q))

maze[x][y]=3;

else

//檔案儲存地圖

file *fp;

fp=fopen("plat.txt","w");

for(i=0;i=0)

break;

case 2: printf("圍牆內為修改範圍,範圍是%dx%d\n",m-2,n-2);

printf("請輸入座標x,y(行,列)修改地圖:\n");

//清除來自鍵盤的30多個快取字元,防止死迴圈bug

for(i=0;i<30;i++)

fflush(stdin);

scanf("%d,%d",&a,&b);

if(a<=(m-2)&&b<=(n-2)&&a>0&&b>0&&maze[a][b]!=1&&maze[a][b]!=3)

maze[a][b]=0;

else

break;

case 3:

g++;

k=((double)g/answer)/2*100+50; //計算後面一半完成的百分比情況

printf("已完成%d%%,請繼續等待( ̄▽ ̄)/\r",k);

c=g;

if(c==answer) //防止過度迴圈,比較answer條路徑。 191844是檢測了我自己建的地圖的全部可能路徑次數 檔案是plat.txt

else if(best.b[i][j] == 1)

printf("の");

else if(best.b[i][j]==3)

printf("糧");

else

printf(" ");

printf("\n");

}printf("已顯示最優解,方案如上!(〃'▽'〃)\n");

maze[p][q]=0;

return;

// exit(0);

} }++l;

if(g!=answer)

maze[p][q]=0;

}void path_find(int p,int q) //尋找通關路徑的模組

if (maze[p][q+1]==3||maze[p][q-1]==3||maze[p+1][q]==3||maze[p-1][q]==3) //判斷當前位置上下左右是否有糧倉

else if(maze[i][j] == 1)

printf("の");

else if(maze[i][j]==3)

printf("糧");

else

printf(" ");

}printf("\n");

} printf("已顯示方案,如上!請稍等。。。\n");

g++;

} if(g!=15)

maze[p][q]=0;

}void main() //主函式,選單控制介面

} else

}}

————2023年8月20日

python迷宮尋路 迷宮尋路問題 A 演算法

迷宮尋路問題 a 演算法 迷宮尋路問題是人工智慧中的有趣問題,如何表示狀態空間和搜尋路徑是尋路問題的重點,本文的主要內容是a 搜尋演算法的理解和應用,首先對基本知識和演算法思想進行了解,再通過其對迷宮問題求解應用,編寫 python 程式進行深入學習。1.搜尋區域 我們假設某個人要從 start 點...

迷宮尋路(A星尋路演算法)

題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...

從算法學起C語言 老鼠走迷宮

背景說明 老鼠走迷宮是遞迴求解的基本問題,我們在二維陣列中用2表示迷宮牆壁,使用1來表示老鼠走過的路徑,求出由入口到出口的路徑。大 白話文 有迷宮擋在了你和妹子 帥哥中間,自己看著辦吧。首先列印個小迷宮看看 全封閉?no!我們去掉最右邊和最底下的一行,只要這個7 7方陣,外邊包起來主要是看路徑的時候...