C語言實(shí)現(xiàn)走迷宮
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)走迷宮的具體代碼,供大家參考,具體內(nèi)容如下
描述
給一張個(gè)迷宮,問能否從起點(diǎn)走到終點(diǎn),只能往上下左右走,不能斜著走
輸入
多組測(cè)試數(shù)據(jù),每組第一行兩個(gè)正整數(shù),分別為n和m
表示n這個(gè)迷宮有n行m列(0<n,m<10)
接著是n行m列,
'#'表示路
‘*'表示墻
‘S'表示起點(diǎn)
‘T'表示終點(diǎn)
輸出
每組測(cè)試數(shù)據(jù)輸出一個(gè)結(jié)果,如果能從S走到T,輸出“YES”,否則輸出“NO”
輸入樣例:
2 2
S*
#T
3 3
S*#
#T
##
輸出樣例:
YES
NO
有兩種方法可以解決這個(gè)問題
第一種深度優(yōu)先搜索:站在入口,考慮自己下一步可以走哪里,走到下一個(gè)位置后,再考慮下一步怎么走,一直走下去,直到?jīng)]有路,然后再返回最近的一個(gè)岔路口,選其它任一條沒試過的路,如果不能走,再嘗試其他的路,直到這個(gè)岔路口的路全部試完,再回到上一個(gè)路口,看是否能走到出口,相當(dāng)于一條路走到黑
#include<bits/stdc++.h> using namespace std; char a[20][20]; //存儲(chǔ)迷宮字符數(shù)組 int flag,m,n; int sdep_x[4]={-1,1,0,0},sdep_y[4]={0,0,-1,1};//控制上下左右方向 int vis[20][20]; //標(biāo)記走過的路 void dfs(int x,int y) { vis[x][y]=1; //代表被標(biāo)記過了 if(a[x][y]=='T') //找到出口 { flag=1; return; } for(int i=0;i<4;i++) //搜索路徑 { int h=x+sdep_x[i]; int l=y+sdep_y[i]; if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索路徑的條件 { dfs(h,l); } } } int main() { while(cin>>n>>m) { memset(vis,0,sizeof(vis));//初始化數(shù)組 flag=0; int f,g; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(a[i][j]=='S')//先找到路口 { f=i; g=j; } } dfs(f,g); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
第二種方法廣度優(yōu)先搜索:這一步之后,把接下來一步的所有路都列出來,在之后的所有擴(kuò)展之中,在以一個(gè)為下一步,再將所有的該步可以到達(dá)的下一步,全部列舉出來,再將第二步的其他選擇中的每一步,都一一做擴(kuò)展,每次擴(kuò)展,都要檢查所擴(kuò)展的地方有沒有到達(dá)搜索的要求。
可以定義一個(gè)隊(duì)列,將擴(kuò)展的點(diǎn)位置保存在隊(duì)列,將擴(kuò)展完畢的點(diǎn)出隊(duì)
#include<bits/stdc++.h> using namespace std; int vis[20][20]; char a[20][20]; int n,m; int step_x[4]={-1,1,0,0},step_y[4]={0,0,-1,1}; struct data//定義一個(gè)結(jié)構(gòu)體,里面包含x,y成員 { int x; int y; }; data s,p;//定義兩個(gè)結(jié)構(gòu)體變量 queue<data>q;//定義一個(gè)隊(duì)列q int BFS() { while(!q.empty())//當(dāng)隊(duì)列不為空時(shí) { p=q.front();//返回隊(duì)列的第一個(gè)元素 vis[p.x][p.y]=1; q.pop();//刪除隊(duì)列中最靠前的元素 if(a[p.x][p.y]=='T')//如果找到出口 return 1; else { for(int i=0;i<4;i++) { s.x=p.x+step_x[i]; s.y=p.y+step_y[i]; if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&!vis[s.x][s.y]&&a[s.x][s.y]!='*')//搜索條件 q.push(s);//將擴(kuò)展的點(diǎn)的位置存入隊(duì)尾 } } } return 0; } int main() { while(cin>>n>>m) { while(!q.empty()) { q.pop();//清空隊(duì)列中的元素 } for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { vis[i][j]=0; if(a[i][j]=='S') { s.x=i; s.y=j; q.push(s);//將路口的位置保存在隊(duì)尾 } } } if(BFS()) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之圖書借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口
設(shè)計(jì)一個(gè)上層的IPC接口,這個(gè)接口將在未來封裝底層的通信機(jī)制,這樣的設(shè)計(jì)要求接口足夠抽象,以便于底層實(shí)現(xiàn)的細(xì)節(jié)對(duì)上層用戶透明,本文給大家介紹了如何使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03- 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送2021-11-11