穿越泥地(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\n",vis[x+500][y+500]-1); //system("pause"); return 0; }