码迷,mamicode.com
首页 > 其他好文 > 详细

P1605 迷宫

时间:2021-04-08 13:47:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:empty   map   剪枝   遍历   mes   就是   main   continue   std   

吐槽

  首先声明,DFS可以拿满分,BFS只能拿一半分。现在不想BFS了,着手模拟吧

收获

  这道没做出来的BFS,其实让我收获很大很大!!!让我明白回溯,剪枝,DFS,BFS的区别。

  对于寻找路径问题,就是用DFS或BFS。

  找出所有路径,那么就需要DFS和回溯了。注意在回溯过程中,要修改遍历和未遍历的状态

  寻找最短,最大,那就是DFS、剪枝、回溯了。剪枝,顾名思义,就是减去搜索树中不符合要求的部分,简单来说就是做下一步时进行判断,我下一步合不合理。(接着走是否是最小呢?之类的)

DFS

注意检查的是新坐标!!!

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int sx,sy,ex,ey;
 4 int maps[6][6];
 5 int dir[4][2]={
 6     {0,1},
 7     {1,0},
 8     {0,-1},
 9     {-1,0}
10 };
11 int n,m;
12 int num=0;
13 bool check(int x,int y)
14 {
15     return x>=1&&x<=n&&y>=1&&y<=n&&maps[x][y]==1;
16 }
17 void dfs(int x,int y)
18 {
19     if(x==ex&&y==ey){
20         num++;
21         return;
22     }
23     maps[x][y]=0;
24     for(int i=0;i<4;i++){
25         if(check(x+dir[i][0],y+dir[i][1])){
26             dfs(x+dir[i][0],y+dir[i][1]);
27         }
28     }
29     maps[x][y]=1;
30 }
31 int main()
32 {
33     int t;
34     cin>>n>>m>>t;
35     for(int i=1;i<=n;i++){
36         for(int j=1;j<=m;j++){
37             maps[i][j]=1;//1表示可通过
38         }
39     }
40     cin>>sx>>sy>>ex>>ey;
41     for(int i=0;i<t;i++){
42         int x,y;
43         cin>>x>>y;
44         maps[x][y]=0;
45     }
46     dfs(sx,sy);
47     cout<<num;
48     return 0;
49 }

BFS

 

#include<bits/stdc++.h>
using namespace std;
int sx,sy,ex,ey;
int maps[6][6];
int dir[4][2]={
    {0,1},
    {1,0},
    {0,-1},
    {-1,0}
};
int n,m;
int num=0;
bool check(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=n&&maps[x][y]==1;
}
struct node{int x,y;};
void bfs()
{
    queue<node> q;
    node nownode;
    nownode.x=sx;
    nownode.y=sy;
    q.push(nownode);
    while(!q.empty()){
        nownode=q.front();
        q.pop();
        if(nownode.x==ex&&nownode.y==ey){
            num++;
            continue;
        }
        maps[nownode.x][nownode.y]=0;
        for(int i=0;i<4;i++){
            node nextnode;
            int next_x=nownode.x+dir[i][0];
            int next_y=nownode.y+dir[i][1];
            if(check(next_x,next_y)){
                nextnode.x=next_x;
                nextnode.y=next_y;
                q.push(nextnode);
            }
        }
        maps[nownode.x][nownode.y]=1;
    }
}
int main()
{
    int t;
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            maps[i][j]=1;//1表示可通过
        }
    }
    cin>>sx>>sy>>ex>>ey;
    for(int i=0;i<t;i++){
        int x,y;
        cin>>x>>y;
        maps[x][y]=0;
    }
    bfs();
    cout<<num;
    return 0;
    
}

 

P1605 迷宫

标签:empty   map   剪枝   遍历   mes   就是   main   continue   std   

原文地址:https://www.cnblogs.com/lvjt0208/p/14629861.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!