acmdream1191 bfs+优先队列
来源:互联网 发布:淘宝装修公司靠谱吗 编辑:程序博客网 时间:2024/05/17 09:37
http://115.28.76.232/problem?pid=1191
Problem Description
You are the prince of Dragon Kingdom and your kingdom is in danger of running out of power. You must find power to save your kingdom and its people. An old legend states that power comes from a place known as Dragon Maze. Dragon Maze appears randomly out of nowhere without notice and suddenly disappears without warning. You know where Dragon Maze is now, so it is important you retrieve some power before it disappears.
Dragon Maze is a rectangular maze, an N×M grid of cells. The top left corner cell of the maze is (0, 0) and the bottom right corner is(N-1, M-1). Each cell making up the maze can be either a dangerous place which you never escape after entering, or a safe place that contains a certain amount of power. The power in a safe cell is automatically gathered once you enter that cell, and can only be gathered once. Starting from a cell, you can walk up/down/left/right to adjacent cells with a single step.
Now you know where the entrance and exit cells are, that they are different, and that they are both safe cells. In order to get out of Dragon Maze before it disappears, you must walk from the entrance cell to the exit cell taking as few steps as possible.
If there are multiple choices for the path you could take, you must choose the one on which you collect as much power as possible in order to save your kingdom.
Input
The first line of the input gives the number of test cases, T(1 ≤ T ≤ 30). T test cases follow.
Each test case starts with a line containing two integers N and M(1 ≤ N, M ≤ 100), which give the size of Dragon Maze as described above.
The second line of each test case contains four integers enx, eny, exx, exy(0 ≤ enx, exx < N, 0 ≤ eny, exy < M), describing the position of entrance cell (enx, eny) and exit cell (exx, exy).
Then N lines follow and each line has M numbers, separated by spaces, describing the N×M cells of Dragon Maze from top to bottom.
Each number for a cell is either -1, which indicates a cell is dangerous, or a positive integer, which indicates a safe cell containing a certain amount of power.
Output
For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1).
If it's possible for you to walk from the entrance to the exit, y should be the maximum total amount of power you can collect by taking the fewest steps possible.
If you cannot walk from the entrance to the exit, y should be the string "Mission Impossible." (quotes for clarity).
Sample Input
22 30 2 1 02 -1 53 -1 64 40 2 3 2-1 1 1 21 1 1 12 -1 -1 11 1 1 1
Sample Output
Case #1: Mission Impossible.Case #2: 7
刚开始的时候没想到用优先队列,采用了普通的队列直接进行了bfs后来才想到自己忘记了写回溯,这样一来先搜到的路如果不是最优解的话一旦标记就把后面的本来可行的路给封死了,无疑就得不到正解了,因此我们在搜索的时候一定要保证先搜到的肯定是最优解,想到这里就很容易想到优先队列了,那么题目就迎刃而解了
#include <stdio.h>#include <iostream>#include <string.h>#include <queue>using namespace std;struct note{ int x,y,num,sum; note() {} note(int _x,int _y,int _num,int _sum):x(_x),y(_y),num(_num),sum(_sum) {} bool operator <(const note a)const { return (a.num<num||(a.num==num&&sum<a.sum)); }};int dx[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};int T,n,m,x1,x2,y1,y2,a[150][150];bool flag[150][150];priority_queue<note>q;bool judge(int x,int y){ if(x<n&&x>=0&&y<m&&y>=0&&a[x][y]!=-1) return true; return false;}bool bfs(note p){ memset(flag,0,sizeof(flag)); while(!q.empty()) q.pop(); q.push(p); while(!q.empty()) { note p=q.top(); int x=p.x; int y=p.y; int num=p.num; int sum=p.sum; if(x==x2&&y==y2) { printf("%d\n",sum); return true; } q.pop(); for(int i=0; i<4; i++) { int xx=x+dx[i][0]; int yy=y+dx[i][1]; if(judge(xx,yy)&&flag[xx][yy]==0) { q.push(note(xx,yy,num+1,sum+a[xx][yy])); flag[xx][yy]=1; } } } return false;}int main(){ int T,tt=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); for(int i=0; i<n; i++) for(int j=0; j<m; j++) scanf("%d",&a[i][j]); printf("Case #%d: ",++tt); if(!bfs(note(x1,y1,0,a[x1][y1]))) printf("Mission Impossible.\n"); } return 0;}
- acmdream1191 bfs+优先队列
- 优先队列+BFS
- hdu1242优先队列BFS
- HDU4198-BFS+优先队列
- Hdu2822Dogs bfs+优先队列
- hdu4198-优先队列+bfs
- BFS+队列优先
- 优先队列+BFS
- hdu5040 优先队列+bfs
- HDU1026 bfs+优先队列
- hdu1071Nightmare(BFS+优先队列)
- HDU2026 BFS+优先队列
- HDOJ1026 优先队列bfs
- HDU1242 BFS+优先队列
- BFS-优先队列
- 优先队列+bfs 模板
- hdu1242 BFS+优先队列
- HDOJ1242Rescue(BFS+优先队列)
- 数据结构——栈的基本操作
- mac 全局快捷键启动应用程序
- sizeof与strlen 对字符串
- (Android) UUID
- [转]NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- acmdream1191 bfs+优先队列
- MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL
- 修改Oracle字符集
- 完全覆盖
- MFC 改变窗口类名
- 专业语言:Java程序设计的基本结构
- linux 网络编程【五】 非阻塞通信epoll
- 使用回调函数,简单模拟dbutils中Queryrunner的工作原理,并重写Queryrunner,使其使用起来更加简单方便
- localtime与localtime_r