6264:走出迷宫(DFS和BFS)
生活随笔
收集整理的這篇文章主要介紹了
6264:走出迷宫(DFS和BFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述 輸入第一行是兩個整數n和m(1<=n,m<=100),表示迷宮的行數和列數。
接下來n行,每行一個長為m的字符串,表示整個迷宮的布局。字符'.'表示空地,'#'表示墻,'S'表示起點,'T'表示出口。 輸出輸出從起點到出口最少需要走的步數。 DFS #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>using namespace std;int n,m,walk[200][200],sx,sy,ex,ey,ans=0x3f3f3f3f;
char s[200][200];int row[4]={-1,0,1,0};
int col[4]={0,1,0,-1};void DFS(int x,int y,int sum)
{if(x==ex&&y==ey){if(sum<ans)ans=sum;return;}for(int i=0;i<=3;i++){int xx=x+row[i];int yy=y+col[i];if(xx>=0&&xx<m&&yy>=0&&yy<n&&walk[xx][yy]>sum+1&&s[xx][yy]!='#'){walk[xx][yy]=sum+1;DFS(xx,yy,sum+1);}}return;
}
int main()
{cin>>m>>n;memset(walk,0x3f,sizeof(walk));for(int i=0;i<m;i++){for(int j=0;j<n;j++){cin>>s[i][j];if(s[i][j]=='S'){sx=i;sy=j;}if(s[i][j]=='T'){ex=i;ey=j;}}}walk[sx][sy]==0;DFS(sx,sy,0);cout<<ans<<endl;return 0;
}
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue>using namespace std;const int maxn=100; struct node{int x,y;int step; }S,T,Node;int n,m; char maze[maxn][maxn]; bool inq[maxn][maxn]; int X[4]={0,0,1,-1}; int Y[4]={1,-1,0,0};bool test(int x,int y) {if(x>=n||x<0||y>=m||y<0) return false;if(maze[x][y]=='#'||inq[x][y]==true) return false;return true; }int BFS() {queue<node>q;q.push(S);while(!q.empty()){node top=q.front();q.pop();if(top.x==T.x&&top.y==T.y){return top.step;}for(int i=0;i<4;i++){int newX=top.x+X[i];int newY=top.y+Y[i];if(test(newX,newY)){Node.x=newX;Node.y=newY;Node.step=top.step+1;q.push(Node);inq[newX][newY]=true;}}}return -1; }int main() {scanf("%d%d",&n,&m);for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>maze[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(maze[i][j]=='S'){S.x=i;S.y=j;}if(maze[i][j]=='T'){T.x=i;T.y=j;}}}S.step=0;printf("%d\n",BFS());return 0; }
當你站在一個迷宮里的時候,往往會被錯綜復雜的道路弄得失去方向感,如果你能得到迷宮地圖,事情就會變得非常簡單。
假設你已經得到了一個n*m的迷宮的圖紙,請你找出從起點到出口的最短路。
接下來n行,每行一個長為m的字符串,表示整個迷宮的布局。字符'.'表示空地,'#'表示墻,'S'表示起點,'T'表示出口。
?
BFS#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <queue>using namespace std;const int maxn=100; struct node{int x,y;int step; }S,T,Node;int n,m; char maze[maxn][maxn]; bool inq[maxn][maxn]; int X[4]={0,0,1,-1}; int Y[4]={1,-1,0,0};bool test(int x,int y) {if(x>=n||x<0||y>=m||y<0) return false;if(maze[x][y]=='#'||inq[x][y]==true) return false;return true; }int BFS() {queue<node>q;q.push(S);while(!q.empty()){node top=q.front();q.pop();if(top.x==T.x&&top.y==T.y){return top.step;}for(int i=0;i<4;i++){int newX=top.x+X[i];int newY=top.y+Y[i];if(test(newX,newY)){Node.x=newX;Node.y=newY;Node.step=top.step+1;q.push(Node);inq[newX][newY]=true;}}}return -1; }int main() {scanf("%d%d",&n,&m);for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>maze[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(maze[i][j]=='S'){S.x=i;S.y=j;}if(maze[i][j]=='T'){T.x=i;T.y=j;}}}S.step=0;printf("%d\n",BFS());return 0; }
?
轉載于:https://www.cnblogs.com/Fy1999/p/9011519.html
總結
以上是生活随笔為你收集整理的6264:走出迷宫(DFS和BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: erlang进程的调度效率
- 下一篇: 宇宙中除了地球还会有其他星球上有生命体吗