zoukankan      html  css  js  c++  java
  • bfs(最短路径)

    https://ac.nowcoder.com/acm/contest/993/F


    题意:从(0,0)到X , Y最少要走几步,其中有一些点是泥坑不能走。

    思路:bfs注意:该题坐标会出现负数,所以标记数组要统一加500转化为正数。或则直接用map标记。

    #include <iostream>
    #include <iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <set>
    using namespace std;
    const int N = 500 ;
    int   x[10009] , y[10009] , vis[1009][1009];
    int len1 , len2 , dir[4][2] = {{1 , 0} , {-1 , 0}, {0 , 1} ,{0 , -1}};
    int mx , my , p;
    
    struct Node{
        int x, y , ans ;
        Node(int x = 0, int y = 0 , int ans = 0){
            this->x = x ;
            this->y = y ;
            this->ans = ans ;//记录步数
        }
    }n[10009];
    
    bool check(int x , int y)
    {
        if(!vis[x + N][y + N] && x + 500 <= 1000 && x + 500 >= 0 && y + 500 <= 1000 && y + 500 >= 0)
            return true ;
        else
            return false ;
    }
    
    int bfs(int x , int y)
    {
        queue<Node>q;
        q.push(Node(x , y , 0));
        vis[x + N][y + N] = 1 ;
        Node temp , step ;
        while(!q.empty())
        {
    
            temp = q.front();
            q.pop() ;
            if(temp.x == mx && temp.y == my)
            {
                return temp.ans ;
            }
            for(int i = 0 ; i < 4 ; i++)
            {
                step.x = temp.x + dir[i][0];
                step.y = temp.y + dir[i][1];
                step.ans = temp.ans + 1 ;
                if(check(step.x , step.y))
                {
                    vis[step.x + N][step.y + N] = 1 ;
                    q.push(Node(step));
                }
            }
    
        }
    
    }
    
    void init()
    {
        memset(vis , 0 , sizeof(vis));
    }
    
    
    int main()
    {
        while(~scanf("%d%d%d" , &mx , &my , &p))
        {
            init() ;
            for(int i = 0 ; i < p ; i++)
            {
                scanf("%d%d" , &n[i].x , &n[i].y);
                vis[n[i].x + N][n[i].y + N] = 1 ;
            }
            cout << bfs(0 , 0) <<endl ;
    
        }
    
    
        return 0;
    }
    #include <iostream>
    #include <iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <set>
    using namespace std;
    const int N = 500 ;
    int   x[10009] , y[10009] , vis[1009][1009];
    int len1 , len2 , dir[4][2] = {{1 , 0} , {-1 , 0}, {0 , 1} ,{0 , -1}};
    int mx , my , p;
    
    struct Node{
        int x , y , step ;
    };
    
    void bfs()
    {
        queue<Node>q;
        q.push({500 , 500 , 0});
        vis[500][500] = 1 ;
        while(!q.empty())
        {
            Node temp = q.front();
            q.pop() ;
            int x = temp.x , y = temp.y , s = temp.step ;
            if(x == mx + 500 && y == my + 500)
            {
                printf("%d
    " , s);
                break ;
            }
            for(int i = 0 ; i < 4 ; i++)
            {
                int tx = x + dir[i][0];
                int ty = y + dir[i][1];
                int ts = s + 1 ;
                if(tx < 0 || tx > 1000 || ty < 0 || ty > 1000)
                {
                    continue ;
                }
                if(vis[tx][ty])
                    continue ;
                q.push({tx , ty , ts});
                vis[tx][ty] = 1 ;
            }
    
        }
    
    }
    
    void init()
    {
        memset(vis , 0 , sizeof(vis));
    }
    
    int main()
    {
        while(~scanf("%d%d%d" , &mx , &my , &p))
        {
            init() ;
            for(int i = 0 ; i < p ; i++)
            {
                int a , b ;
                scanf("%d%d" , &a , &b);
                vis[a + N][b + N] = 1 ;
            }
            bfs();
    
        }
    
    
        return 0;
    }
     
  • 相关阅读:
    ajax提交的javascript代码
    简述jpg、gif、png-8、png-24的区别,分别使用场景
    5种IE hasLayoutt的属性及其值
    EF线程唯一与DBSession接口对接
    报错:未能加载文件或程序集“XXX”或它的某一个依赖项。系统找不到指定的文件
    报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"
    ASP.NET 之异步处理一(Session处理)
    C#基础之类的出现
    Hadoop
    Hadoop
  • 原文地址:https://www.cnblogs.com/nonames/p/11240515.html
Copyright © 2011-2022 走看看