1. 程式人生 > >Luogu P1519 穿越柵欄 Overfencing

Luogu P1519 穿越柵欄 Overfencing

思路 距離 namespace 從數據 ++ == ems nod over

吐槽

這搜索,真TMD惡心。我調了倆小時。。。。。。喪盡天良

坑點

  • 從出口往裏跳的時候只能挑一格。
  • 從別的格子跳往其他格子的時候只能跳兩格
  • 跳兩格的時候還必須判斷中間隔過去的一格是不是空格
  • 輸入格式也很惡心,在要求讀空格的前提下好的辦法只有gets,但是用gets會把兩個整數後面的回車讀進去。。

思路

從數據範圍來看的話,從每個點都搜一遍最短距離是不現實的了。。當然不排除你寫的很好看QwQ。我的想法是將兩個出口找出來,然後跑兩邊BFS,每個點都維護一個距離的最小值

要註意分類討論從出口往別的格子跳和從普通格子跳往普通格子。跑的還挺快。空間也不大。我排在最優解的第二頁QwQ

代碼

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>

const int INF = 2147483647;

using namespace std;

int n, m, sx[3], sy[3], cnt, ans;
char map[208][90];
int dis[208][90];
int dx[5] = {0, 2, 0, -2};
int dy[5] = {2, 0, -2, 0};

int rx[5
] = {0, 1, 0, -1}; int ry[5] = {1, 0, -1, 0}; struct node { int x, y, sum; }temp, now; queue<node> Q; bool vis[208][90]; inline void BFS(int num) { memset(vis, 0, sizeof(vis)); while (!Q.empty()) Q.pop(); vis[sx[num]][sy[num]] = 1; temp.sum = 0, temp.x = sx[num], temp.y = sy[num]; Q.push(temp);
while (!Q.empty()) { now = Q.front(); int x = now.x, y = now.y, s = now.sum; Q.pop(); dis[x][y] = min(s, dis[x][y]); for(int i=0; i<4; i++) { int xx = dx[i]+x, yy = dy[i]+y; int zx = rx[i]+x, zy = ry[i]+y; if(!vis[xx][yy] && map[xx][yy] == && xx <= 2*n+1 && xx > 0 && yy <= 2*m+1 && yy > 0 && map[zx][zy] == && (x != sx[num] || y != sy[num])) { vis[xx][yy] = 1; temp.x = xx, temp.y = yy, temp.sum = s+1; Q.push(temp); } if(!vis[zx][zy] && map[zx][zy] == && x == sx[num] && y == sy[num] && zx <= 2*n+1 && zy <= 2*m+1 && zx > 0 && zy > 0) { vis[zx][zy] = 1; temp.x = zx, temp.y = zy, temp.sum = s+1; Q.push(temp); } } } } int main() { scanf("%d%d", &m, &n); for(int i=1; i<=2*n+1; i++) { for(int j=1; j<=2*m+1; j++) { dis[i][j] = INF; } } gets(map[0]); for(int i=1; i<=2*n+1; i++) { gets(map[i]+1); for(int j=1; j<=2*m+1; j++) { if(i == 1 || j == 1 || i == 2*n+1 || j == 2*m+1) if(map[i][j] == ) { sx[++cnt] = i; sy[cnt] = j; } } } BFS(1); BFS(2); for(int i=1; i<=2*n+1; i++) { for(int j=1; j<=2*m+1; j++) { if(dis[i][j] != INF) ans = max(ans, dis[i][j]); } } printf("%d", ans); }

Luogu P1519 穿越柵欄 Overfencing