這個是學校的課設,剛開始有點頭疼,但是感覺越做越有意思了,於是就有如下**,可能相較於大佬還有差距,但是這是我目前所能做的最優的程式了吧!話不多說,說一下**的核心內容吧!
迷宮是通過二維陣列構造的,二維組中的數字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方陣,外邊包起來主要是看路徑的時候...