日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

CSP认证201604-4游戏[C++题解]:bfs、拆点、迷宫问题加强版、三维数组

發布時間:2025/4/5 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP认证201604-4游戏[C++题解]:bfs、拆点、迷宫问题加强版、三维数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目解答
      • 題目鏈接

題目解答

來源:acwing

分析:這題和普通的bfs求走迷宮問題很像,走迷宮告訴哪些點不能走,是永遠不能走,這樣bfs的時候很容易處理。本題是這些障礙點在某段時間內不能走,這就給初學者帶來了問題,這些變化的障礙點怎么處理呢?

其實,這里用到的技巧是拆點,這里的含義是多考慮一維,即時間。在a,b這段時間內阻礙的話,就標記為true,表示這段時間內不能走。

while(T --){int x, y, a, b;cin >> x >> y >> a >> b;for(int i = a; i <= b; i ++)// 從a到b時刻不能走,標記為trueg[x][y][i] = true;}

加上這樣的處理之后,就可以按照普通的bfs來搜了。

AC代碼

#include<bits/stdc++.h> using namespace std; const int N = 110, M = 310;int n, m, T; // g(x,y,z)表示點(x,y)在哪些時刻是障礙, //st表示該點走過或者不能走,都標記為true bool g[N][N][M], st[N][N][M];// 結構體表示點的坐標,z表示時間 struct Node{int x, y, z; };int bfs(){queue<Node> q;st[1][1][0] = true;q.push({1, 1, 0});int dx[4] = { -1, 0, 1, 0}, dy[4] = { 0, 1, 0, -1};while(q.size()){auto t = q.front();q.pop();for(int i = 0; i< 4; i ++){int x = t.x + dx[i], y = t.y + dy[i],z = t.z + 1;if(x < 1 || x > n || y < 1 || y > m || g[x][y][z]) continue;if(!st[x][y][z]){if(x == n && y == m) return z; st[x][y][z] = true;q.push({x, y , z});}}}return -1; }int main(){cin >> n >> m >> T;while(T --){int x, y, a, b;cin >> x >> y >> a >> b;for(int i = a; i <= b; i ++)// 從a到b時刻不能走,標記為trueg[x][y][i] = true;}cout << bfs() << endl; }

題目鏈接

https://www.acwing.com/problem/content/3233/

總結

以上是生活随笔為你收集整理的CSP认证201604-4游戏[C++题解]:bfs、拆点、迷宫问题加强版、三维数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。