(还记得我昨天大概没人看到的博客(我删辽)吗qwq,

那篇博客大致内容就是:我提交楼上这道题,交了好久好久好久好久

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

现在我告诉你,那次评测还N/A着呢qwq)

【洛谷p1605】迷宫 随笔 第1张tqlqwq

回归正题qwq,今天是来写题解的:

传送门【        】

算法标签嘤嘤嘤:

【洛谷p1605】迷宫 随笔 第2张它幸好没出dfs,要不然我非要打死把这个题放在bfs(还是由简单到困难的第一个题的wz)小姐姐,伪装成后面没东西的样子qwq

【洛谷p1605】迷宫 随笔 第3张

行吧让我们宽广的搜索吧qwq:

 

其实这道题更像是个搜索回溯,每走一步可以退回原状态来看原状态是否还有符合的,但是我们练的是bfs嘛对不对,当然要写bfs了(不会写搜索回溯)

可不可以直接上代码qwq:

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,t,sx,sy,fx,fy,x,y,ans;
bool b[10][10];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
struct coder{//定义一个结构体coder(我也不知道为什么要叫这个名字) 
    int x,y;//结构体内包含横纵坐标 
    int gl[10][10];//和用来标记这个点是否走过的数组gl(我是不会告诉你我拿我初中同学的名字来命名变量的qwq)
};
coder hyh;//定义一个coder型变量hyh(我是不会告诉你我拿我初中同学的名字来命名变量的qwq) 
queue<coder> q;//定义一个coder型队列q 
void bfs(){//广搜 
    hyh.x=sx;//把起点的横纵坐标赋给hyh.x,hyh.y; 起点标记为已访问 
    hyh.y=sy;
    hyh.gl[sx][sy]=1;
    q.push(hyh);//入队 
    while(!q.empty()){
        coder h=q.front();//取出队首元素 
        q.pop();//把队首元素出队 
        for(int i=0;i<4;i++){
            int xx=h.x,yy=h.y;
                xx+=dx[i];
                yy+=dy[i];
                if(xx>n||xx<1||yy>m||yy<1||b[xx][yy]||h.gl[xx][yy]){//判断不满足条件的情况(不满足就进行下一次循环) 
                    continue;
                }
                if(xx==fx&&yy==fy){//到终点,ans+1; 
                ans++;
                continue;
                }
                hyh.x=xx;//没有到终点,把走一步后的元素给hyh(包括某一个位置走过否 
                hyh.y=yy;
                memcpy(hyh.gl,h.gl,sizeof(h.gl));
                hyh.gl[xx][yy]=1;//把走到这个点标为1 
                q.push(hyh);//入队 
            }
        }
    }
int main(){
    scanf("%d%d%d",&n,&m,&t);//输入惹 
    scanf("%d%d",&sx,&sy);
    scanf("%d%d",&fx,&fy);
    for(int i=1;i<=t;i++){
      scanf("%d%d",&x,&y);
      b[x][y]=1;//构造了一个矩阵,如同一个01地图,障碍物标记为1,通路标记为0; 
    }
    bfs();//广搜代码,与dfs(大法师)相对 
    cout<<ans<<endl;
}

end-

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄