首页 > 技术文章 > bfs(同一最短路径)

nonames 2019-11-24 17:04 原文

http://oj.jxust.edu.cn/contest/Problem?id=1702&pid=7

题意:现在有两个相同大小的地图,左上角为起点,右下角问终点。问是否存在同一条最短路径。最短距离一样,他们走的路径也一样。

n 行 m 列(1 <= n , m <= 500)

存在就输出YES , 否则NO;

 

解法:三个bfs (其中一个是合并的图),判断三个最短路径是否相等且不为-1(不存在)。

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF  0x3f3f3f3f
#define mod 20191117
#define PI acos(-1)
using namespace std;
typedef long long ll ;
char s[509][509] , str[509][509];
int vis[509][509];
int dir[4][2] = {{1 , 0} , {-1 , 0} , {0 , 1} , {0 , -1}};
int n , m ;

struct node
{
    int x , y , w ;
};


int bfs1(int x , int y , int w)
{
    node a , b ;
    a.x = x , a.y = y , a.w = w ;
    queue<node>q;
    q.push(a);
    vis[x][y] = 1 ;
    while(!q.empty())
    {
        a = q.front();
        q.pop();
        if(a.x == n - 1 && a.y == m -1)
        {
            return a.w ;
        }
        for(int i = 0 ; i < 4 ; i++)
        {
            b.x = a.x + dir[i][0];
            b.y = a.y + dir[i][1];
            b.w = a.w + 1 ;
            if(b.x < 0 || b.x >= n || b.y < 0 || b.y >= m || vis[b.x][b.y] || s[b.x][b.y] == '#')
            {
                continue ;
            }
            vis[b.x][b.y] = 1 ;
            q.push(b);
        }
    }
    return -1;
}

int bfs2(int x , int y , int w)
{
    node a , b ;
    a.x = x , a.y = y , a.w = w ;
    queue<node>q;
    q.push(a);
    vis[x][y] = 1 ;
    while(!q.empty())
    {
        a = q.front();
        q.pop();
        if(a.x == n - 1 && a.y == m -1)
        {
            return a.w ;
        }
        for(int i = 0 ; i < 4 ; i++)
        {
            b.x = a.x + dir[i][0];
            b.y = a.y + dir[i][1];
            b.w = a.w + 1 ;
            if(b.x < 0 || b.x >= n || b.y < 0 || b.y >= m || vis[b.x][b.y] || str[b.x][b.y] == '#')
            {
                continue ;
            }
            vis[b.x][b.y] = 1 ;
            q.push(b);
        }
    }
    return -1;
}

int main()
{

    scanf("%d%d" , &n , &m);
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < m ; j++)
        {
            cin >> s[i][j] ;
        }
    }
    int ans1 = bfs1(0 , 0 , 0);
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < m ; j++)
        {
            cin >> str[i][j];
            if(str[i][j] == '#' && s[i][j] == '*')
            {
                s[i][j] = '#';
            }
        }
    }
    memset(vis , 0 , sizeof(vis));
    int ans2 = bfs2(0 , 0 , 0) ;
    memset(vis , 0 , sizeof(vis));
    int ans3 = bfs1(0 , 0 , 0) ;
    if(ans1 == ans2 && ans2 == ans3 && ans1 != -1)
    {
        printf("YES\n");
    }
    else{
        printf("NO\n");
    }

    return 0;
}

 

推荐阅读