标签:push none color 输入 最短路 queue 看到了 iostream bsp
清早6:00,Farmer John就离开了他的屋子,开始了他的例行工作:为Bessie挤奶。前一天晚上,整个农场刚经受过一场瓢泼大雨的洗礼,于是不难想象,FJ现在面对的是一大片泥泞的土地。FJ的屋子在平面坐标(0,0)的位置,Bessie所在的牛棚则位于坐标(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)。每个泥塘都只占据了它所在的那个格子。
Farmer John自然不愿意弄脏他新买的靴子,但他同时想尽快到达贝茜所在的位置。为了数那些讨厌的泥塘,他已经耽搁了一些时间了。如果Farmer John只能平行于坐标轴移动,并且只在x、y均为整数的坐标处转弯,那么他从屋子门口出发,最少要走多少路才能到贝茜所在的牛棚呢?你可以认为从FJ的屋子到牛棚总是存在至少一条不经过任何泥塘的路径。
第一行,3个用空格隔开的整数:X,Y和N;
第二至第N+1行,第i+1行为2个用空格隔开的整数:A_i和B_i。
一行,输出一个整数,即FJ在不踏进泥塘的情况下,到达贝茜所在牛棚所需要走过的最小距离。
1 2 7
0 2
-1 3
3 1
1 1
4 2
-1 1
2 2
11
根据求最短路径可以得到是bfs,直接暴力即可。
#include <iostream> #include <queue>> #define MAXN 10001 using namespace std; const int dx[4] = {-1,1,0,0}, dy[4] = {0,0,-1,1}; int x, y, n; int a[1010][1010]; queue<int> qx, qy; int main() { cin >> x >> y >> n; a[x + 501][y + 501] = 1; for(register int i = 1, tmpx, tmpy; i <= n; i++) { cin >> tmpx >> tmpy; a[tmpx + 501][tmpy + 501]= -1; } qx.push(501); qy.push(501); int ans = 0; while(!qx.empty()) { ans++; for(int I = qx.size(); I; I--) { x = qx.front(); y = qy.front(); qx.pop(); qy.pop(); for(register int i = 0; i < 4; i++) { if(x + dx[i] < 1 || x + dx[i] > 1001 || y + dy[i] < 1 || y + dy[i] > 1001) continue; if(a[x + dx[i]][y + dy[i]] == 1) return cout << ans, 0; if(!a[x + dx[i]][y + dy[i]]) a[x + dx[i]][y + dy[i]] = -1, qx.push(x + dx[i]), qy.push(y + dy[i]); } } } return 0; }
标签:push none color 输入 最短路 queue 看到了 iostream bsp
原文地址:https://www.cnblogs.com/kcn999/p/10624999.html