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
- NOJ1141 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- React 标签和属性支持
- AngularJS中ng-class使用方法
- 安装ruby一定要注意的一步(ruby -v和 rbenv version结果不一致)
- 秒杀系统架构分析与实战
- SecureCRT 遇到一个致命的错误且必须关闭——解决
- NOJ1141 走迷宫
- QCOM耳机检测功能是如何注册input设备的
- Android中Preference的使用以及监听事件分析
- Linux中批量重命名的方法
- 面试题总结——JAVA高级工程师
- 解析几何:第六章 二次曲面(1)球面 椭球面 双曲面
- 创建守护进程并且接收信号
- POJ2391:Ombrophobic Bovines floyd+二分答案+最大流
- Android自动化测试(UiAutomator)介绍与学习