zoukankan      html  css  js  c++  java
  • P1605 迷宫

    P1605 迷宫

    这是一道毒瘤题。。。

    这是一道广搜题 bfs 。。。

    注释:

    1.memcpy(b,a,sizeof(a))

       把 a 的值全部复制给 b 

      memcpy(b,a,sizeof(int)*k)

       把 a 中的 k 个元素复制给 b 

    头文件:#include<cstring>

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<queue>
    using namespace std;
    int n,m,t,sx,sy,fx,fy,tx,ty,ans=0;
    bool vis[10][10];   //表示是否为墙
    int dx[4]={-1,1,0,0},
        dy[4]={0,0,-1,1};
    struct pos         //结构体 x代表横坐标,y代表纵坐标,used[][]代表是否走过
    {
        int x,y,used[10][10];
    
    };
    bool pan(int x,int y)   //判断是否合法
    {
        return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0;
    }
    
    pos sa;
    void bfs()
    {
        queue<pos>q;    //队列
        sa.x=sx;
        sa.y=sy;
        sa.used[sx][sy]=1;  //标记已走
        q.push(sa);    //入队
        while(!q.empty())
        {
            pos h=q.front();
            q.pop();          //出队
            for(int i=0;i<=3;i++)
            {
                int xx=h.x+dx[i];
                int yy=h.y+dy[i];
                if(h.used[xx][yy]||(!pan(xx,yy)))    //不可以走
                  continue ;
                if(xx==fx&&yy==fy)     //到终点
                {
                    ans++;
                    continue ;
                }
                
                sa.x=xx;
                sa.y=yy;
                memcpy(sa.used,h.used,sizeof(h.used)); //鬼知道这是干什么哒(我知道了)注释1
                sa.used[xx][yy]=1; 
                q.push(sa);       //新的入队
                
            }
        }
    }
    int main()
    {
        cin>>n>>m>>t;
        cin>>sx>>sy>>fx>>fy;
        for(int i=1;i<=t;i++)
        {
            cin>>tx>>ty;
            vis[tx][ty]=1;
        }
        
        bfs();     //广搜
        
        cout<<ans;
        
        return 0;
        
    }

    这还是一道深搜题 dfs 。。。

    回顾一下递归回溯算法框架:

    int search(int x,int y)
    {
        if(到目的地)  输出解;
    else for(int i=1;i<=算符种数;i++) { if(符合条件) { 保存结果;
    search(下一层);
    恢复:保存结果之前的状态{回溯}; } } }

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<queue>
    using namespace std;
    int n,m,t,sx,sy,fx,fy,tx,ty,ans=0;
    bool vis[10][10];
    int dx[4]={-1,1,0,0},
        dy[4]={0,0,-1,1};
    bool pan(int x,int y)
    {
        return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0;
    }
    
    void dfs(int x,int y)
    {
        if(x==fx&&y==fy)
            ans++;
    
        for(int i=0;i<=3;i++)
        {
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(pan(xx,yy))
            {
                vis[xx][yy]=1;
                dfs(xx,yy);
                vis[xx][yy]=0;
            }
        }
    }
    int main()
    {
        cin>>n>>m>>t;
        cin>>sx>>sy>>fx>>fy;
        for(int i=1;i<=t;i++)
        {
            cin>>tx>>ty;
            vis[tx][ty]=1;
        }
        vis[sx][sy]=1;
        dfs(sx,sy);
        
        cout<<ans;
        
        return 0;
        
    }
  • 相关阅读:
    scala言语基础学习七
    scala言语基础学习六
    scala言语基础学习五
    scala言语基础学习四
    scala言语基础学习三(面向对象编程)
    scala言语基础学习三
    scala言语基础学习二
    scala言语基础学习
    并发编程实战的阅读(锁的重入)
    数据库必会必知 之 SQL四种语言:DDL DML DCL TCL(转)
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10719573.html
Copyright © 2011-2022 走看看