NOJ1141 走迷宫

来源:互联网 发布:域名投资从入门到精通 编辑:程序博客网 时间:2024/05/04 17:59

描述
判断是否能从迷宫的入口到达出口。

输入
先输入两个整数表示迷宫的行数m和列数n,再输入口和出口的坐标,最后分m行输入迷宫,其中1表示墙,0表示空格每个数字之间都有空格。

输出
若能到达,则输出”Yes”,否则输出”No”,结果占一行。

输入样例
3 3
0 0
2 2
0 0 0
1 1 0
0 1 0

输出样例
Yes

  • BFS
#include <iostream>using namespace std;const int maxm = 20 + 5;const int maxn = 20 + 5;int A[maxm][maxn];int m, n;                                   //行数、列数int beginx, beginy, endx, endy;             //起点、终点坐标int state;                                  //迷宫状态bool isConnected(int row, int col) {        //判断当前点是否可达    if(row >= 0 && row < m && col >= 0 && col < n && A[row][col] == 0)        return true;    return false;}void BFS(int row, int col) {    if(row == endx && col == endy) {        state = 1;        return;    }    if(isConnected(row - 1, col)) A[row-1][col] = 1, BFS(row - 1, col);    if(isConnected(row + 1, col)) A[row+1][col] = 1, BFS(row + 1, col);    if(isConnected(row, col - 1)) A[row][col-1] = 1, BFS(row, col - 1);    if(isConnected(row, col + 1)) A[row][col+1] = 1, BFS(row, col + 1);}int main() {    while(cin >> m >> n >> beginx >> beginy >> endx >> endy) {        state = 0;        for(int i = 0; i < m; i++)            for(int j = 0; j < n; j++)                cin >> A[i][j];        BFS(beginx, beginy);        if(state)            cout << "Yes" << endl;        else            cout << "No" << endl;    }    return 0;}
  • DFS
#include <iostream>#include <stack>using namespace std;const int maxm = 20 + 5;const int maxn = 20 + 5;int m, n;int A[maxm][maxn];bool isConnected(int i, int j) {    if(i >= 0 && i < m && j >= 0 && j < n && A[i][j] == 0)        return true;    return false;}bool DFS(int startx, int starty, int finishx, int finishy) {    stack<int> x;    stack<int> y;    x.push(startx);    y.push(starty);    int i = startx, j = starty;    A[i][j] = 1;    int cnt = 0;    while(!x.empty() && i != finishx || j != finishy) {        if(isConnected(i-1, j)) {            A[--i][j] = 1;            x.push(i), y.push(j);        }        else if(isConnected(i+1, j)) {            A[++i][j] = 1;            x.push(i), y.push(j);        }        else if(isConnected(i, j-1)) {            A[i][--j] = 1;            x.push(i), y.push(j);        }        else if(isConnected(i, j+1)) {            A[i][++j] = 1;            x.push(i), y.push(j);        }        else {            x.pop(); y.pop();            if(x.empty()) break;            i = x.top(), j = y.top();        }    }    if(x.empty())        return false;    return true;}int main() {    int startx, starty, finishx, finishy;    while(cin >> m >> n >> startx >> starty >> finishx >> finishy) {        for(int i = 0; i < m; i++)            for(int j = 0; j < n; j++)                cin >> A[i][j];        if(DFS(startx, starty, finishx, finishy))            cout << "Yes" << endl;        else cout << "No" << endl;    }    return 0;}
2 0
原创粉丝点击