#include<iostream> #include<queue> #include<cstring> #include<cstdio> #define MAX 100 using namespace std; const int INF = 10; typedef pair<int, int >P; int d[MAX][MAX]; char imap[MAX][MAX]; int n, m; int sx, sy; int gx, gy; int To[4][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; int bfs() { for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) d[i][j] = INF; queue<P>que; que.push(P(sx, sy)); d[sx][sy] = 0; while (que.size()) { P t = que.front(); que.pop(); if (t.first == gx&&t.second == gy)break; for (int i = 0; i < 4; i++) { int nx = To[i][0] + t.first; int ny = To[i][1] + t.second; if (nx >= 0 && nx < n&&ny >= 0 && ny < m&&imap[nx][ny] != '#'&&d[nx][ny] ==INF) { que.push(P(nx, ny)); d[nx][ny] = d[t.first][t.second] + 1; } } } return d[gx][gy]; } struct node { int x; int y; int r; node(int X, int Y, int R) :x(X), y(Y), r(R){}; node() :x(0), y(0), r(0){}; }; int BFS() { memset(d, 0, sizeof(d)); queue<node>que; que.push(node(sx, sy, 0)); while (que.size()) { node t = que.front(); que.pop(); d[t.x][t.y] = 1; if (t.x == gx&&t.y == gy) return t.r; for (int i = 0; i < 4; i++) { int nx = To[i][0] + t.x; int ny = To[i][1] + t.y; if (nx >= 0 && nx < n&&ny >= 0 && ny < m&&imap[nx][ny] != '#'&&!d[nx][ny]) que.push(node(nx, ny, t.r + 1)); } } return INF; } int main() { while (cin >> n >> m) { int i, j; for (i = 0; i < n; i++) for (j = 0; j < m; j++) { cin >> imap[i][j]; if (imap[i][j] == 'S') { sx = i; sy = j; } else if (imap[i][j] == 'G') { gx = i; gy = j; } } cout << "bfs: " << bfs() << endl; cout << "BFS: " << BFS() << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。