穿越泥地(mud) (BFS)

问题 C: 穿越泥地(mud)

时间限制: 1 Sec  内存限制: 128 MB
提交: 16  解决: 10
[提交][状态][讨论版]

题目描述

清早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

提示

样例说明:贝茜所在牛棚的坐标为(1,2)。FJ能看到7个泥塘,它们的坐标分别为(0,2),(-1,3),(3,1),(1,1),(4,2),(-l,1),(2,2)。

以下为农场的简图(*为FJ的屋子,B为贝茜呆的牛棚):

y

4| . . . . . . . .

3| . M . . . . . .

2| . . M B M . M .

1| . M . M . M . .

0| . . * . . . . .

-1| . . . . . . . .

--------------------→ x

-2-1 0 1 2 3 4 5

FJ的最佳路线是:(0,0),(-1,0),(-2,0),(-2,1),(-2,2),(-2,3),(-2,4),

(-1,4),(0,4),(0,3),(1,3),(1,2)。

【分析】由于某些坐标是负数,我们把每个坐标+500就成正的了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
using namespace std;
int n,m,flag=0,a,b;
int dis[4][2]= {1,0,0,1,-1,0,0,-1};
int vis[1005][1005];
int w[1005][1005];
struct man
{
    int x,y,step;
};
queue<man>q;
void bfs(man s)
{
    q.push(s);
vis[s.x][s.y]=1;
    while(!q.empty())
    {
        man t=q.front();
        q.pop();
        //printf("%d %d %d\n",t.x,t.y,t.step);system("pause");
        if(t.x==a&&t.y==b){printf("%d\n",t.step);flag=1;return;}
       for(int i=0;i<4;i++)
       {
           int xx=t.x+dis[i][0];int yy=t.y+dis[i][1];//
           //printf("%d %d\n",xx,yy);
           if(xx>=0&&xx<=1000&&yy>=0&&yy<=1000&&w[xx][yy]!=1&&vis[xx][yy]==0)
           {
               man k;k.x=xx;k.y=yy;k.step=t.step+1;q.push(k);vis[xx][yy]=1;
           }
       }
    }
}
int main()
{
    int g,h;
    memset(vis,0,sizeof(vis));
    memset(w,0,sizeof(w));
    scanf("%d%d%d",&a,&b,&n);man s;
    a+=500;b+=500;
    for(int i=0;i<n;i++){scanf("%d%d",&g,&h);w[g+500][h+500]=1;}
   s.x=500;s.y=500;s.step=0;
    bfs(s);
    //if(flag==0)printf("-1\n");
    return 0;
}

时间: 2024-10-12 20:08:50

穿越泥地(mud) (BFS)的相关文章

bzoj 1627: [Usaco2007 Dec]穿越泥地【bfs】

在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=1005,dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int n,sx,sy; bool a[N][N],v[N][N]; struct qwe { int x,y,b; qwe(int X=0,i

BZOJ 1627: [Usaco2007 Dec]穿越泥地( BFS )

BFS... --------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #define rep( i , n ) for( int i = 0 ; i

bzoj1627[Usaco2007 Dec]穿越泥地*

bzoj1627[Usaco2007 Dec]穿越泥地 题意: 网格中有一些障碍物,求从起点到终点最小步数.-500≤坐标≤500 题解: bfs.所有坐标均加上500,就可以只考虑第一象限了. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++)

1627: [Usaco2007 Dec]穿越泥地

1627: [Usaco2007 Dec]穿越泥地 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 504  Solved: 325[Submit][Status] Description 清早6:00,Farmer John就离开了他的屋子,开始了他的例行工作:为贝茜挤奶.前一天晚上,整个农场刚经受过一场瓢泼大雨的洗礼,于是不难想见,FJ 现在面对的是一大片泥泞的土地.FJ的屋子在平面坐标(0, 0)的位置,贝茜所在的牛棚则位于坐标(X,Y) (-5

bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles

P2873 [USACO07DEC]泥水坑Mud Puddles bfs入门. 对于坐标为负的情况,我们可以给数组下标加上$abs(min(minx,miny))$转正(根据题意判断) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #define re register 6 using namespace std; 7 #define M 502

【BZOJ 1627】 [Usaco2007 Dec]穿越泥地

1627: [Usaco2007 Dec]穿越泥地 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 511  Solved: 332 [Submit][Status] Description 清早6:00,Farmer John就离开了他的屋子,开始了他的例行工作:为贝茜挤奶.前一天晚上,整个农场刚经受过一场瓢泼大雨的洗礼,于是不难想见,FJ 现在面对的是一大片泥泞的土地.FJ的屋子在平面坐标(0, 0)的位置,贝茜所在的牛棚则位于坐标(X,Y) (

[Usaco2007 Dec]穿越泥地[bfs][水]

Description 清早6:00,Farmer John就离开了他的屋子,开始了他的例行工作:为贝茜挤奶.前一天晚上,整个农场刚经受过一场瓢泼大雨的洗礼,于是不难想见,FJ 现在面对的是一大片泥泞的土地.FJ的屋子在平面坐标(0, 0)的位置,贝茜所在的牛棚则位于坐标(X,Y) (-500 <= X <= 500; -500 <= Y <= 500)处.当然咯, FJ也看到了地上的所有N(1 <= N <= 10,000)个泥塘,第i个泥塘的坐标为 (A_i, B_

【map|BFS】BZOJ 1627 [Usaco2007 Dec]穿越泥地

因为题目有坐标可以为负,所以解决方法有两种. 一是整体把棋盘的路线加上一个比较大的数值 之后再进行操作 优点:运行速度快 二是用map<pair<int,int>,bool> 储存 优点:简单易写 #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <map> using namespace std; str

UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

UVA 1600 Patrol Robot Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The colu