1685: Route Planning
来源:互联网 发布:数控铣床编程代码d 编辑:程序博客网 时间:2024/06/08 16:05
题目描述
然而事情并不是Richard想的那么简单,等他登陆后他才发现,地图里有各种各样的炸弹和关卡。当Richard经过炸弹的时候,他需要花费1分钟的时间拆弹;地图中有关卡对应的通行证,如果Richard拿到了通行证,那么它就可以通过对应的关卡。现在请你重新为Richard规划一条路线,使执行任务的时间最短。
.代表空地
‘#’代表障碍
@代表出发点
*代表任务地点
=代表炸弹
1-4代表通行证
a-d代表关卡
输入
输入第一行为T,即有T组输入数据(1<=T<=10)
每组数据第一行为整数N 10≤N≤100,代表地图的长度和宽度
接下来为N行,每行N个字符,代表地图
输出
输出一个整数,为Richard从起点出发到达终点所需的最短时间。
如果Richard无法到达终点,请输出MISSION FAILED
每组输出占一行
样例输入
5
@….
.1…
…..
=a###
….*
样例输出
8
传入节点不会段溢出
#include<iostream>#include<queue>#include<cstring>#include <cstdio>#include<memory.h>using namespace std;const int N=120;int ans, n, treax[10], treay[10], treal;bool a[N][N][20][64];int fx[] = {0, 1, 0, -1, 0}, fy[] = {0, 0, 1, 0, -1};char maze[N][N];struct node{ int x, y, time; int board, trea;};int judgenum(int x, int y){ for(int i = 1; i <= treal; i++) { if(treax[i] == x && treay[i] == y ) { return i; } }}node New, now, first;void bfs(node xxx){ queue<node> q; a[first.x][first.y][first.trea][first.board] = true; ans = 9999; q.push(first); while(!q.empty()) { now = q.front(); q.pop(); if(maze[now.x][now.y] == '*') { ans = min(now.time, ans); continue; } for(int i = 1; i <= 4; i++) { New = now; New.x += fx[i]; New.y += fy[i]; New.time ++ ; if(New.x < 1 || New.y < 1 || New.x > n || New.y > n || maze[New.x][New.y] == '#') continue; char ch = maze[New.x][New.y]; if(ch == '=') { int xx = judgenum(New.x, New.y); if((New.trea & (1<<xx)) == 0) New.trea |= (1<<xx); if(!a[New.x][New.y][New.trea][New.board]) { a[New.x][New.y][New.trea][New.board] = true; New.time ++; q.push(New); } } else if(ch >= '1' && ch <= '4') { int j = maze[New.x][New.y] - '1'; New.board |= (1<<j); if(!a[New.x][New.y][New.trea][New.board]) { q.push(New); a[New.x][New.y][New.trea][New.board] = true; } } else if(ch >= 'a' && ch <= 'd') { if(New.board & (1<<(ch-'a')) && !a[New.x][New.y][New.trea][New.board]) { a[New.x][New.y][New.trea][New.board] = true; q.push(New); } } else if(!a[New.x][New.y][New.trea][New.board]) { a[New.x][New.y][New.trea][New.board] = true; q.push(New); } } }}int main(){ int t, x, y; while(scanf("%d", &n) != EOF){ //scanf("%d", &n); memset(a, 0, sizeof(a)); treal = 0; for(int i = 1; i <= n; i++) { scanf("%s", &maze[i][1]); for(int j = 1; j <= n; j++) { if(maze[i][j] == '@') { first.x = i; first.y = j; } else if(maze[i][j] == '=') { treax[++treal] = i; treay[treal] = j; } } } first.time = 0; first.board = 0; first.trea = 0; bfs(first); if(ans == 9999) printf("MISSION FAILED\n"); else printf("%d\n", ans); } //} return 0;}
0 0
- 1685: Route Planning
- BFS-Route Planning
- Efficient Route Planning on Public Transportation Networks: A Labelling Approach
- Planning
- Planning
- Planning
- Planning
- Planning
- Planning
- Route
- Route
- route
- route
- Route
- ROUTE
- route
- route
- route
- javascript 传参练手
- Java web:SSH项目拷贝产生问题以及解决(getContextPath() xml hibernate等报错)
- referrer地重要性
- 使用ViewPager和Fragment实现底部导航滑动重构版
- jsp页面报 $ is not defined
- 1685: Route Planning
- 利用索引优化查询,提高效率
- uva 437
- colorAccent,colorPrimary,colorPrimaryDark
- Sketch
- 前端要给力之:代码可以有多烂?
- start.S解析11
- 第八周项目33-对类中深复制的体验
- unix网络编程---读书笔记(一)---tcp/udp/sctp简介