先摆错误代码
#include<iostream>
#include<queue>
using namespace std;
int n, m,ans;
char map[201][201];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
struct state {
int x; int y; int ti;
friend bool operator<(state s1,state s2)
{
return s2.ti < s1.ti;
}
};
state be, e[200];
bool in(int x, int y) {
return x >= 1 && y >= 1 && x <= n && y <= m && map[x][y] != '#';
}
int bfs() {
priority_queue <state>q;
q.push(be);
state cur, next;
while (!q.empty()) {
cur = q.top();
for (int i = 0; i < ans; i++) {
if (cur.x == e[i].x && cur.y == e[i].y)return cur.ti;
}
q.pop();
for (int i = 0; i < 4; i++) {
next.x = cur.x + dir[i][0];
next.y = cur.y + dir[i][1];
if (in(next.x, next.y)) {
next.ti++;
if (map[next.x][next.y] == 'x') next.ti++;
q.push(next);
}
}
}
}
int main() {
while (cin >> n >> m) {
ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> map[i][j];
if (map[i][j] == 'a') {
be.x = i; be.y = j;
be.ti = 0;
}
if (map[i][j] == 'r') {
e[ans].x = i;
e[ans].y = j;
ans++;
}
}
}
int t=bfs();
if (t)cout << t << endl;
else cout << "Poor Dingba has to stay in the prison all his life." << endl;
}
}
感觉问题是没有剪枝,然后一直在套娃啥的
然后就vis标记呗
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m,ans;
char map[201][201]; int mintime[201][201];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
struct state {
int x; int y; int ti;
friend bool operator<(state s1,state s2)
{
return s2.ti < s1.ti;
}
};
state be;
bool in(int x, int y) {
return x >= 1 && y >= 1 && x <= n && y <= m && map[x][y] != '#';
}
int bfs() {
priority_queue <state>q;
q.push(be);
state cur, next;
while (!q.empty()) {
cur = q.top();
mintime[cur.x][cur.y] = 1;
if (map[cur.x][cur.y]=='r')return cur.ti;
q.pop();
for (int i = 0; i < 4; i++) {
next.x = cur.x + dir[i][0];
next.y = cur.y + dir[i][1];
if (in(next.x, next.y)) {
next.ti=cur.ti+1;
if (map[next.x][next.y] == 'x') next.ti++;
if(!mintime[next.x][next.y])
{
q.push(next);
mintime[next.x][next.y] = 1;
}
}
}
}
return 0;
}
int main() {
while (cin >> n >> m) {
ans = 0; memset(mintime, 0, sizeof(mintime));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> map[i][j];
if (map[i][j] == 'a') {
be.x = i; be.y = j;
be.ti = 0;
}
}
}
int t=bfs();
if (t)cout << t << endl;
else cout << "Poor Dingba has to stay in the prison all his life." << endl;
}
}