穿越泥地(mud)

穿越泥地(mud)

题目描述

清早6:00,FJ就离开了他的屋子,开始了他的例行工作:为贝茜挤奶。前一天晚上,整个农场刚经受过一场瓢泼大雨的洗礼,于是不难想象,FJ现在面对的 是一大片泥泞的土地。FJ的屋子在平面坐标(0,0)的位置j贝茜所在的牛棚则位于坐标(x,y) (-500≤x≤500; -500≤Y≤500)处。当然,FJ也看到了地上的所有N(1≤N≤10000)个泥塘,第i个泥塘的坐标为(A_i,B_i) (-500≤A_i≤500:-500≤B_i≤500)。每个泥塘都只占据了它所在的那个格子。
FJ自然不愿意弄脏他新买的靴子,但他同时想尽快到达贝茜所在的位置。为了数那些讨厌的泥塘,他已经耽搁了一些时间了。如果FJ只能平行于坐标轴移动,并 且只在x、y均为整数的坐标处转弯,童那么他从屋子门口出发,最少要走多少路才能到贝茜所在的牛棚呢?你可以认为从FJ的屋子到牛棚总是存在至少一条不经 过任何泥塘的路径。

输入

第1行:3个用空格隔开的整数:X,Y和N:
第2~N+1行:第i+l行为2个用空格隔开的整数:A_i和B_i。

输出

输出1个整数,即FJ在不踏进泥塘的情况下,到达贝茜所在牛棚所需要走过的最小距离。

样例输入

1 2 7
0 2
-1 3
3 1
1 1
4 2
-1 1
2 2

样例输出

11
分析:bfs,注意处理坐标;
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include <queue>
#define ll long long
#define rep(i,m,n) for(i=m;i<=n;i++)
#define inf 0x3f3f3f3f
#define mp make_pair
#define pii pair<int,int>
const int maxn=1e3+10;
using namespace std;
int n,m,vis[maxn][maxn],x,y;
const int dis[][2]={0,1,1,0,-1,0,0,-1};
char a[maxn][maxn];
void dfs()
{
    queue<pii>p;
    vis[500][500]=1;p.push(mp(500,500));
    while(!p.empty())
    {
        pair<int,int> b=p.front();p.pop();
        for(int i=0;i<4;i++)
        {
            int l=b.first+dis[i][0],r=b.second+dis[i][1];
            if(l>=0&&l<1001&&r>=0&&r<1001&&!vis[l][r]&&a[l][r]!='1')
            {
                    vis[l][r]=vis[b.first][b.second]+1;
                    p.push(mp(l,r));
                    if(l==x+500&&r+500==y)return;
            }
        }
    }
}
int main()
{
    int i,j,k,t;
    scanf("%d%d%d",&x,&y,&n);
    memset(a,'0',sizeof(a));
    while(n--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        a[u+500][v+500]='1';
    }
    dfs();
    printf("%d
",vis[x+500][y+500]-1);
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/5703407.html