二维迷宫--双模板--bfs

直接附上代码,具体题目需要直接改编才能达到目的:

注意使用条件:模板假定起点一定可以移动到终点,其他情况需要根据题目改编扩展;

#include<queue>
#include<iostream>
using namespace std;
#include<algorithm> 
const int INF=1e9;
const int MAX=1000+10;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
typedef pair<int,int> P;
char maze[MAX][MAX];
int N,M;
int sx,sy;//起点
int gx,gy;//终点
int d[MAX][MAX];//到各个位置最短距离的数组
int bfs(){
	queue<P>que;
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++)
			d[i][j]=INF;
	que.push(P(sx,sy));
	d[sx][sy]=0;
	while(que.size()){
		P p=que.front();
		que.pop();
		if(p.first==gx&&p.second==gy)
			break;//终点结束
		//四个方向循环
		for(int i=0;i<4;i++){
			int nx=p.first+dx[i],ny=p.second+dy[i];
			//判断check
			if(nx>=0&&ny>=0&&nx<N&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
				que.push(P(nx,ny));
				d[nx][ny]=d[p.first][p.second]+1;
			} 
		} 	
	}
	return d[gx][gy];
} 
int main(){
	//输入 
	return 0;
}

具体的一道题目:Aizu - 0558-经典迷宫改编好题。

https://blog.csdn.net/queque_heiya/article/details/104086807

 

另外的一个模板,可以判断没有路可走,具体见代码就可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<cstdio>
using namespace std;
int n,m;
const int MAX=1000+10; 
char maze[MAX][MAX];
bool vis[MAX][MAX];//标记数组 
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};//方向数组 
bool dfs(int x, int y){
    if(maze[x][y]=='T'){//终点退出 
        return true;
    }
    vis[x][y]=1;
    maze[x][y]='m';//用m标记,之后统计TTTT 
    for(int i=0;i<4;i++){
        int tx=x+dir[i][0];
        int ty=y+dir[i][1];
        if(0<=tx&&tx<n&&0<=ty&&ty<m&&maze[tx][ty]!='*'&&!vis[tx][ty]){
            if(dfs(tx,ty)){
                return true;
            }
        }
    }
    vis[x][y]=0;
    maze[x][y]='.'; 
    return false;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){ 
    	memset(maze,0,sizeof(maze));
    	memset(vis,0,sizeof(vis));
	    for(int i=0;i<n;i++){
	        scanf("%s",maze[i]);
	    }
	    int x,y;//定义起点x,y; 
	    for(int i=0;i<n;i++){
	        for (int j=0;j<m;j++){
	            if (maze[i][j]=='S'){
	                x=i,y=j;//找起点
					break; 
	            }
	        }
	    }
	    int ans=0;
	    bool flag=dfs(x,y);
	    if(flag){
	        for(int i=0;i<n;i++)
	        	for(int j=0;j<m;j++)
	    			if(maze[i][j]=='m')
	    				ans++;
	    }
	    //ans即为最短路径
		cout<<ans<<endl; 
	} 
}
/*
输入: 
5 6
....S*
.***..
.*..*.
*.***.
.T....
输出:
9*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值