map|BFSBZOJ 1627 [Usaco2007 Dec]穿越泥地
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map|BFSBZOJ 1627 [Usaco2007 Dec]穿越泥地相关的知识,希望对你有一定的参考价值。
因为题目有坐标可以为负,所以解决方法有两种。
一是整体把棋盘的路线加上一个比较大的数值 之后再进行操作 优点:运行速度快
二是用map<pair<int,int>,bool> 储存 优点:简单易写
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> #include <map> using namespace std; struct node{ int x,y,step; }point[100005],Start; map<pair<int,int>,bool>vis; map<pair<int,int>,bool>Map; int fx[]={0,0,-1,0,1},fy[]={0,-1,0,1,0}; int Sx,Sy,n,step; void BFS(){ queue<node>Q; vis[make_pair(0,0)]=1; Start.x=0; Start.y=0; Start.step=0; Q.push(Start); while( !Q.empty() ){ node now = Q.front(); Q.pop(); for(int i=1;i<=4;i++){ int tx = now.x + fx[i]; int ty = now.y + fy[i]; if(tx==Sx && ty==Sy){ printf("%d\n",now.step+1); return; } if(Map[make_pair(tx,ty)] || vis[make_pair(tx,ty)]) continue; node sb; sb.x=tx; sb.y=ty; vis[make_pair(tx,ty)]=1; sb.step=now.step+1; Q.push(sb); } } } void init(){ scanf("%d%d%d",&Sx,&Sy,&n); for(int i=1;i<=n;i++){ int a,b; scanf("%d%d",&a,&b); Map[make_pair(a,b)]=1; } } int main(){ init(); BFS(); return 0; }
以上是关于map|BFSBZOJ 1627 [Usaco2007 Dec]穿越泥地的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1627: [Usaco2007 Dec]穿越泥地bfs
bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles
bfsBZOJ1102- [POI2007]山峰和山谷Grz
状压DPBZOJ 1725 Usaco Corn Fields牧场的安排