站長(zhǎng)之家 wordpress 流量統(tǒng)計(jì)2023年新聞?wù)畻l
目錄
一、題目
1、題目描述
2、輸入輸出
2.1輸入
2.2輸出
3、原題鏈接
二、解題報(bào)告
1、思路分析
2、復(fù)雜度
3、代碼詳解
一、題目
1、題目描述
2、輸入輸出
2.1輸入
2.2輸出
3、原題鏈接
https://ac.nowcoder.com/acm/contest/76652/B
二、解題報(bào)告
1、思路分析
以(0, 0) 為起點(diǎn),進(jìn)行bfs
bfs可以每次擴(kuò)展一層,我們每次選擇可擴(kuò)展位置中字符最小的那些
這樣我們會(huì)進(jìn)行多路增廣
由于路徑長(zhǎng)度為n + m - 1,所以只需增廣 n + m - 1 次
2、復(fù)雜度
時(shí)間復(fù)雜度: O(NMlogNM)空間復(fù)雜度:O(NM)
3、代碼詳解
??
#include <bits/stdc++.h>using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr int P = 1'000'000'007;void solve() {int n, m;std::cin >> n >> m;std::vector<std::string> g(n);for (int i = 0; i < n; ++ i)std::cin >> g[i];int t = n + m - 1;std::string ans;std::queue<int> q;q.push(0);std::vector<int> vis(n * m);vis[0] = true;constexpr int dir[3]{1, 0, 1};while (t --) {ans += g[q.front() / m][q.front() % m];std::vector<int> buf;while(q.size()) {int i = q.front();q.pop();int x = i / m, y = i % m;for (int k = 0; k < 2; ++ k) {int nx = dir[k] + x, ny = dir[k + 1] + y;if (nx < 0 || ny < 0 || nx >= n || ny >= m || vis[nx * m + ny]) continue;buf.push_back(nx * m + ny);vis[nx * m + ny] = true;}}std::sort(buf.begin(), buf.end(), [&](int i, int j) -> bool{return g[i / m][i % m] < g[j / m][j % m];});for (int i = 0; i < buf.size() && g[buf[0] / m][buf[0] % m] == g[buf[i] / m][buf[i] % m]; ++ i)q.push(buf[i]);}std::cout << ans;
}auto FIO = []{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);return 0;
}();int main () {#ifdef DEBUGfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifint T = 1;// std::cin >> T;while (T --)solve();return 0;
}