zoukankan      html  css  js  c++  java
  • 搜索回溯(第二)

    再讲两道题:

    马的遍历

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    using namespace std;
    struct xy{
        int x,y;
    }node,Top;
    const int dx[4]={1,-1,2,-2};
    const int dy[4]={1,-1,2,-2};//虽说一共16个方向 但是在程序中有具体判断
    int a[401][401];
    bool b[401][401];
    int n,m;
    void bfs(int x,int y,int step){
        a[x][y] = step;
        b[x][y] = false;
        queue<xy> Q;//构建队列
        node.x = x;
        node.y = y;
        Q.push(node);//起始点入队
        while (!Q.empty()){
            Top=Q.front();//取出队首点
            Q.pop();//队首点出队
                for (int i=0;i<4;i++)
                    for (int j=0;j<4;j++)
                        if (abs(dx[i])!=abs(dy[j])){//判断方向
                            int NewX=Top.x+dx[i];
                            int NewY=Top.y+dy[j];
                            if (NewX<1||NewX>n||NewY<1||NewY>m) continue;//判断越界
                            if (b[NewX][NewY]){//使用布尔数组保证每个点只入队一次 时间复杂度明显低于DFS
                                node.x=NewX;
                                node.y=NewY;
                                Q.push(node);
                                b[NewX][NewY] = false;//标记已入队
                                a[NewX][NewY] = a[Top.x][Top.y]+1;//路径+1
                            }
                        }
        }
    }
    int main(){
        memset(b,true,sizeof(b));
        memset(a,-1,sizeof(a));
        int x,y;
        scanf("%d%d%d%d" ,&n ,&m ,&x ,&y );
        bfs(x,y,0);
        for (int i=1;i<=n;i++){
            for (int j=1;j<=m;j++)
                printf("%-5d", a[i][j]);//注意场宽
            printf("
    ");
        }
        return 0;
    }

    迷宫

    #pragma GCC optimize(2)
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int map[6][6];//画地图 
    bool temp[6][6];//flag 
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0}; //打表,判断方向 
    int total,fx,fy,sx,sy,t,n,m,l,r;//total计数器,fx,fy是终点坐标,
    //sx,sy是起点坐标,T是障碍总数,n,m是地图的长和宽,l,r是障碍的横坐标和纵坐标;
    void search(int x,int y)//进行搜索 
    {
        if(x==fx&&y==fy)//结束坐标 
        {
            total++;
            return;//返回,继续搜索 
        }
        else 
        {
            for(int i=0;i<=3;i++)//左右上下四个方向 
            {
                if(temp[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1)//判断是否存在障碍 
                {
                    temp[x][y]=1;//flag 
                    search(x+dx[i],y+dy[i]);
                    temp[x][y]=0;//还原 
                }    
            } 
        }
    }
    int main()
    {
        cin>>n>>m>>t;//n,m长度宽度,T障碍个数 
        for(int ix=1;ix<=n;ix++)
            for(int iy=1;iy<=m;iy++)
                map[ix][iy]=1;
        cin>>sx>>sy;//起始 
        cin>>fx>>fy;//结束 
        for(int i=1;i<=t;i++)
        {
            cin>>l>>r;//l,r是障碍坐标;
            map[l][r]=0;
        }
        search(sx,sy);
        cout<<total;
        return 0;
    } 

    使用深搜一个个查,使用一个数组map记录障碍的地方,再使用一个temp来标记自己所走过的路;

    int dx[4]={0,0,1,-1};

    int dy[4]={-1,1,0,0};

    使用自动选择方向来代替4个if判断(使代码更加简洁长度变短);

    如果没有障碍并且不是自己走过的,就进一步搜索,把自己走过的路打上标记,返回时,再将标记还原;

  • 相关阅读:
    【leetcode 461】. Hamming Distance
    【leetcode 476】. Number Complement
    大数据概述
    对于编译原理的看法
    PHP基础(二) 文件包含
    PHP基础(一)
    webpack 之(6) commonJS和 ES6 Module区别 (未完成)
    webpack 之(5) webpack.config.js配置 之 img
    webpack 之(4) webpack.config.js配置 之 html
    webpack 之(3) webpack.config.js配置 之 css/less
  • 原文地址:https://www.cnblogs.com/U58223-luogu/p/9528494.html
Copyright © 2011-2022 走看看