称号:

网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示)。你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长、下一个、左、向右移动到下一个单元格。

不论什么时候都不能在障碍格中。也不能走到迷宫之外。

起点和终点保证是空地。

分析:图的BFS。

#include <iostream>
#include <string>
#include <queue>
using namespace std; const int MAXN = 500;
int maze[MAXN][MAXN], vis[MAXN][MAXN], dist[MAXN][MAXN], fa[MAXN][MAXN], last_dir[MAXN][MAXN];
int n, m, xs, ys, xt, yt; int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char name[] = "UDLR"; void print_path(int x, int y) { //以递归的方式打印路径
int fx = fa[x][y] / m;
int fy = fa[x][y] % m;
if(fx != x || fy != y) {
print_path(fx, fy);
putchar(name[last_dir[x][y]]);
}
} int dir[MAXN*MAXN];
void print_path2(int x, int y) { //以迭代的方式打印路径
int c = 0;
for(;;) {
int fx = fa[x][y] / m;
int fy = fa[x][y] % m;
if(fx == x && fy == y) break;
dir[c++] = last_dir[x][y];
x = fx;
y = fy;
}
while(c--) putchar(name[dir[c]]);
} queue<int> q;
void bfs(int x, int y) {
int u = x*m+y;
dist[x][y] = 0; //初始化自己到自己的距离就是0
fa[x][y] = u; //起点的父亲节点就是自己。方便后面的打印操作
vis[x][y] = 1;
q.push(u);
while(!q.empty()) {
u = q.front();
q.pop();
x = u/m;
y = u%m;
for(int d = 0; d < 4; ++d) {
int nx = x + dx[d];
int ny = y + dy[d];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] && !vis[nx][ny]) {
int v = nx * m + ny;
q.push(v);
vis[nx][ny] = 1;
dist[nx][ny] = dist[x][y] + 1; //走的步数+1
fa[nx][ny] = v; //记录父亲结点
last_dir[nx][ny] = d; //记录如今这个节点到父亲节点走的方向
}
}
}
} int main() {
cin >> n >> m >> xs >> ys >> xt >> yt;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cin >> maze[i][j];
}
}
memset(vis, 0, sizeof(vis));
bfs(xs, ys);
print_path(xt, yt);
cout << endl;
print_path2(xt, yt);
cout << endl;
return 0;
}

最新文章

  1. markdown学习/mou
  2. 百度地图TILE算法
  3. 【wikioi】1217 借教室
  4. iOS - Swift NSProcessInfo 系统进程信息
  5. iOS-UITextField中给placeholder动态设置颜色的四种方法
  6. hdu 4628 动态规划
  7. flex打印图片
  8. 九度OJ 1408 吃豆机器人 -- 动态规划
  9. INERT DELEYED、INSERT IGNORE replace into和insert区别
  10. Android技术精髓-Bitmap详解
  11. Java 新特性(3) - JDK7 新特性
  12. tcp异常终止连接
  13. jq的事件对象的属性
  14. UOJ#465. 【HNOI2019】校园旅行 其他
  15. Dynamic CRM插件调试与单元测试
  16. POJ_1185_炮兵阵地 dp+状态压缩
  17. 缓存之 -Redis
  18. Webpack+Vue+ES6 前端组件化开发mobile-multi-page应用实战总结和踩坑
  19. ConcurrentHashMap 的实现原理
  20. 图解ByteBuffer

热门文章

  1. WPF案例 (五) 对控件界面使用倒影
  2. 每天一个JavaScript实例-递归实现反转数组字符串
  3. 找呀志_通过开源框架引AsyncHttpClient上传文件
  4. 【Arduino】8地点LED数码管(3461BS)
  5. android--自己定义ProgressDialog显示位置(其他Dialog子类都能够设置)
  6. SQLserver2012 tcp/ip 1433port问题解决方法
  7. 从零开始学Xamarin.Forms(一) 概述
  8. 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?
  9. Codeforces Round#309 C Kyoya and Colored Balls
  10. iOS开发 编辑框被系统弹出的软键盘遮挡问题