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++)
 6 #define maxn 1010
 7 using namespace std;
 8
 9 inline int read(){
10     char ch=getchar(); int f=1,x=0;
11     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();}
12     while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar();
13     return f*x;
14 }
15 int dis[maxn][maxn],x,y,n; bool bad[maxn][maxn]; queue<pair<int,int> >q;
16 int main(){
17     x=read()+500; y=read()+500; n=read(); inc(i,1,n){int x=read()+500,y=read()+500; bad[x][y]=1;}
18     q.push(make_pair(500,500)); memset(dis,-1,sizeof(dis)); dis[500][500]=0;
19     while(!q.empty()){
20         int xx=q.front().first,yy=q.front().second; q.pop();
21         if(xx>-1000&&!bad[xx-1][yy]&&dis[xx-1][yy]==-1){
22             q.push(make_pair(xx-1,yy)); dis[xx-1][yy]=dis[xx][yy]+1;
23             if(xx-1==x&&yy==y){printf("%d",dis[xx-1][yy]); break;}
24         }
25         if(xx<1000&&!bad[xx+1][yy]&&dis[xx+1][yy]==-1){
26             q.push(make_pair(xx+1,yy)); dis[xx+1][yy]=dis[xx][yy]+1;
27             if(xx+1==x&&yy==y){printf("%d",dis[xx+1][yy]); break;}
28         }
29         if(yy>-1000&&!bad[xx][yy-1]&&dis[xx][yy-1]==-1){
30             q.push(make_pair(xx,yy-1)); dis[xx][yy-1]=dis[xx][yy]+1;
31             if(xx==x&&yy-1==y){printf("%d",dis[xx][yy-1]); break;}
32         }
33         if(yy<1000&&!bad[xx][yy+1]&&dis[xx][yy+1]==-1){
34             q.push(make_pair(xx,yy+1)); dis[xx][yy+1]=dis[xx][yy]+1;
35             if(xx==x&&yy+1==y){printf("%d",dis[xx][yy+1]); break;}
36         }
37     }
38     return 0;
39 }

20160919

时间: 2024-10-03 14:55:35

bzoj1627[Usaco2007 Dec]穿越泥地*的相关文章

【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) (

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

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

[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

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

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&amp;&amp;bzoj1692[Usaco2007 Dec]队列变换*

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出一头奶牛,把她安排到新队列的尾部,然后对剩余的奶牛队列重复以上的操作,直到所有奶牛都被插到了新的队列里.这样得到的队列,就是FJ拉去登记的最终的奶牛队列. 求对于给定的奶牛们的初始位置,计算出可能得到的字典序最小的队列.队列大小≤30000. 题解: 有一个结论:如果当前队列中的队首元素不等于队尾元

1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)

1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 682  Solved: 280[Submit][Status] Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1730  Solved: 727 [Submit][Status][Discuss] Description Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场).有些农场之间原本就有道路相连.