zoukankan      html  css  js  c++  java
  • 蓝桥杯迷宫1

    迷宫

    小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
    小明只能向上下左右四个方向移动。

    输入

    输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
    每组输入的第一行是两个整数N和M(1<=N,M<=100)。
    接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
    字符的含义如下:
    ‘S’:起点
    ‘E’:终点
    ‘-’:空地,可以通过
    ‘#’:障碍,无法通过
    输入数据保证有且仅有一个起点和终点。

    输出

    对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

    样例输入

    1
    5 5
    S-###
    -----
    ##---
    E#---
    ---##
    

    样例输出

    9
    
    #include<iostream>
    #include<queue>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    
    const int maxn=1e3+10;
    int n,m;
    int dxy[4][2]={1,0,0,1,-1,0,0,-1};
    char mp[maxn][maxn];
    int vis[maxn][maxn];
    
    struct node{
    	int x;
    	int y;
    	int level;
    	node(int xx,int yy,int llee)
    	{
    		x=xx;
    		y=yy;
    		level=llee;
    	}
    };
     
    queue<node>q;
    int check(int x,int y){
    	
    	if(x<0 || x>=n || y<0 || y>=m ||vis[x][y] ||mp[x][y]=='#')
    	return 0;
    	return 1;
    
    }
    
    int bfs(int x,int y)
    {
    	vis[x][y]=1;
     
    	q.push(node(x,y,0));  //先进队列,  
    
    	while(!q.empty()){  //队列不为空 
    	
    		
    		int X,Y,Z;
    	    node a=q.front();
    		X=a.x;					//出一个 
    		Y=a.y;
    		Z=a.level;
    		if(mp[a.x][a.y]=='E')   //终止条件 
    		return Z;
    		q.pop();
    		for(int i=0;i<4;i++){  //循环4个方向
    		
    		int dx=a.x+dxy[i][0];
    		int dy=a.y+dxy[i][1]; 
    		
    		if(check(dx,dy)){
    			vis[dx][dy]=1;
    			
    			q.push(node(dx,dy,a.level+1));  //满足条件加入节点 
    		}
    		 
    		
    		
    		
    	}
    }
    }
    
    int main()
    {
    	int k;
    	cin>>k;
    	while(k--){
     
    	cin>>n>>m;
    	int nn,mm;
    	memset(mp,0,sizeof(mp));
    	memset(vis,0,sizeof(vis));
    	for(int i=0;i<n;i++){
    		for(int j=0;j<m;j++){
    			
    			cin>>mp[i][j];
    			if(mp[i][j]=='S')
    			{
    				nn=i;
    				mm=j;
    				
    			}
    		}
    	}
    	
    	cout<<bfs(nn,mm);
    	
    	
    	
    	
    	}
    	
    }
    
    
    
  • 相关阅读:
    Ubuntu的防火墙UFW
    使用Xshell连接Ubuntu
    Markdown 11种基本语法
    Git Push 避免用户名和密码方法
    "git rm" 和 "rm" 的区别
    无限级分类实现思路
    1. Git 克隆代码
    Git 笔记
    git 远程分支创建与推送
    ci 笔记
  • 原文地址:https://www.cnblogs.com/shenxiaodou/p/12557872.html
Copyright © 2011-2022 走看看