zoukankan      html  css  js  c++  java
  • c++ 迷宫搜索(宽搜)

    c++ 迷宫搜索(宽搜)

    题目描述

    迷宫的游戏,相信大家都听过,现在我们用一个n*m的矩阵表示一个迷宫,例如:

    S.X.
    ..X.
    ..XD
    ....

    其中‘S’表示起点,‘D’表示终点,‘X’表示该位置为墙,不可以走,‘.’表示可以通行。每次只能向“上下左右”四个方向移动一步。
    你的任务是判断在x步内(小于等于x),能否从起点走到终点。

    输入

    第一行输入三个数n m x,分别表示迷宫的尺寸和步数。(1 < n,m < 7; 0 < x < 50)

    接下来输入一个n*m的矩阵,描述迷宫的状态。

    输出

    判断是否能在x步内从起点走到终点,如果可以,输出“YES”,否则输出“NO”。

    样例输入

    3 4 5
    S.X.
    ..X.
    ...D
    

    样例输出

    YES
    

    废话不多说,直接上代码

    AC代码

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,z,f,e;//e是入队的下标 f 是出队的下标
    struct point {//结构体 
    	int x,y,step;
    };
    int dx[4]= {1,-1,0,0};//dx[] + dy[] 代表小人走的4个方向可达的点 
    int dy[4]= {0,0,-1,1};
    point q[100],s,t;//q是队列 s是起点 t是终点 
    char g[10][10];//整个队列 (迷宫)即二位数组 
    bool used[10][10];
    int main()
    {
    	scanf("%d %d %d",&n,&m,&z);//输入 
    	for(int i=0; i<=n-1; i++) {//输入 
    		scanf("%s",g[i]);//scanf
    		for(int j=0; j<=m-1; j++) {//获取起点和终点的 x 和 y 坐标 
    			if(g[i][j] == 'S') { 
    				s.x=i,s.y=j,s.step=0;
    			} else if(g[i][j]=='D')
    				t.x=i,t.y=j;
    		}
    	}
    	memset(used ,0,sizeof(used)); //memset
    	q[1]=s,f=1,e=1,used[s.x][s.y]=1;// 把起点入队 
    ////////////////////////////////Strat to BFS///////////////////////////////////////////
    	while(f<=e) {//保证不越界 
    		point u=q[f++];//选定的元素 
    		for(int i=0; i<4; i++) {
    			point v;
    			v.x=u.x+dx[i],v.y=u.y+dy[i],v.step=u.step+1;
    			if(v.x<0||v.x>=n||v.y<0||v.y>m)continue;//如果出了迷宫 
    			if(used[v.x][v.y]==1)continue;//如果已经走过 
    			if(v.step>z)continue;//如果 步数超过规定 
    			if(g[v.x][v.y]=='X')continue;//如果撞墙 
    			if(v.x==t.x&&v.y==t.y) {//如果找到出口
    				cout << v.step << endl;//直接输出在退出 
    				cout<<"YES"<<endl;
    				return 0;
    			}
    			e++;//直接入队 
    			q[e]=v;
    			used[v.x][v.y]=1;
    		}
    	}
    	cout<<"NO"<<endl;
    	return 0;
    }
    
    

    bfs思路总结:
    step1:先找出所有符合规则的数,通过走迷宫的规则和不能穿墙,不能超过迷宫边界,不能超过5步来过滤
    step2:将有效的数入队,入队的同时进行比较是否达到终点
    step3:达到终点就输出yes

  • 相关阅读:
    vector.clear()无法释放内存的对策
    www.wangtam.com
    VC 控件的字体控制 若将字体设置成“宋体、仿宋—GB2312、隶书、幼圆”中的某一字体时,需将lfCharSet设置成GB2312—CHARSET才使设置的字体有效
    CPU使用率 武胜
    MySQL数据类型 转 武胜
    按小时统计的语句 转 武胜
    MYSQL 行转成列 转 武胜
    推荐一个 开源C#股票软件 武胜
    WCF传输泛型 List 对象 转 武胜
    WCF 传输大数据的问题 转 武胜
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11184237.html
Copyright © 2011-2022 走看看