社区讨论
bfs30求调
P8673[蓝桥杯 2018 国 C] 迷宫与陷阱参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m456so2w
- 此快照首次捕获于
- 2024/12/01 13:54 去年
- 此快照最后确认于
- 2025/11/04 13:31 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n, k, vis[1005][1005];
const pair<int, int> dir[]{{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
deque<tuple<int, int, int, int>> dq;
vector<string> v(1);
char getch(){
char c;
while(!isalpha(c = getchar()) and !ispunct(c));
return c;
}signed main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i){
string s(1, ' ');
for(int j = 1; j <= n; ++j)
s.push_back(getch());
v.push_back(s);
}dq.push_back({1, 1, 0, 0});
memset(vis, -1, sizeof(vis));
while(dq.size()){
tuple<int, int, int, int> t = dq[0];
dq.pop_front();
for(pair<int, int> p: dir){
int x = get<0>(t) + get<0>(p), y = get<1>(t) + get<1>(p);
int st = get<2>(t) + 1, mag = max(0, get<3>(t) - 1);
if(x == n and y == n){
printf("%d", st);
return 0;
}if(x < 1 or x > n or y < 1 or y > n) continue;
if(v[x][y] == '%') mag = k;
if(v[x][y] == '#' or v[x][y] == 'X' and !mag or vis[x][y] >= mag) continue;
vis[x][y] = mag;
dq.push_back({x, y, st, mag});
}
}printf("-1");
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...