csdn1780 优先队列BFS
来源:互联网 发布:2017年网络歌曲 编辑:程序博客网 时间:2024/06/01 13:53
题目链接:点击打开链接
第一次是求正常的BFS
第二次是每次要转弯的BFS
求第二个只要记住每个点最多是由相邻的个点走过来的就要好了,用vis2标记四个方向,每个方向最多走一次
#include <iostream>#include<cstdio>#include<cstring>#include<cstdio>#include<cstring>#include<queue>#include<cstdlib>using namespace std;const int maxn=500+10;const int xx[]={0,0,1,-1};const int yy[]={1,-1,0,0};int m[maxn][maxn],vis1[maxn][maxn],vis2[maxn][maxn][4];int N,M,c1,c2,r1,r2; struct node{ int x,y,dis,dir;//dir表示方向 friend bool operator <(node a,node b) { return a.dis>b.dis; }};int check(int x,int y){ if(x>0&&x<=N&&y>0&&y<=M&&m[x][y]!=-1)return 1; return 0;}int bfs1(){ if(c1 == c2&& r1 == r2) return 0; priority_queue<node> q; memset(vis1,0,sizeof(vis1)); node temp,next; temp.x = r1 ; temp.y = c1 ; temp.dis = m[r1][c1]; q.push(temp); vis1[r1][c1] = 1; while(!q.empty()) { temp = q.top(); q.pop(); if(temp.x == r2&&temp.y == c2) return temp.dis; for(int i = 0 ; i < 4; i ++) { int nx = temp.x + xx[i]; int ny = temp.y + yy[i]; next.x=nx,next.y=ny; if(check(nx,ny)&&!vis1[nx][ny]) { vis1[nx][ny] = 1; next.dis = temp.dis +m[nx][ny]; q.push(next); } } } return -1;}int bfs2(){ if(c1 == c2&& r1 == r2) return 0; priority_queue<node> q; memset(vis2,0,sizeof(vis2)); node temp,next; temp.x = r1 ; temp.y = c1 ; temp.dis = m[r1][c1]; temp.dir=-1; q.push(temp); vis1[r1][c1] = 1; while(!q.empty()) { temp = q.top(); q.pop(); if(temp.x == r2&&temp.y == c2) return temp.dis; for(int i = 0 ; i < 4; i ++) { int nx = temp.x + xx[i]; int ny = temp.y + yy[i]; next.x=nx,next.y=ny; if(check(nx,ny)&&!vis2[nx][ny][i]&&temp.dir!=i) { vis2[nx][ny][i] = 1; next.dir=i; next.dis = temp.dis +m[nx][ny]; q.push(next); } } } return -1;}int main(){ int ans=0,i,j; char s[100]; while(~scanf("%d %d %d %d %d %d",&N,&M,&r1,&c1,&r2,&c2)) { memset(m,0x3f,sizeof(m)); for(i=1;i<=N;i++) for(j=1;j<=M;j++) { scanf("%s",s); if(s[0]=='*')m[i][j]=-1; else m[i][j]=atoi(s); } printf("Case %d: %d %d\n",++ans,bfs1(),bfs2()); } return 0;}
阅读全文
0 0
- csdn1780 优先队列BFS
- 优先队列+BFS
- hdu1242优先队列BFS
- HDU4198-BFS+优先队列
- acmdream1191 bfs+优先队列
- Hdu2822Dogs bfs+优先队列
- hdu4198-优先队列+bfs
- BFS+队列优先
- 优先队列+BFS
- hdu5040 优先队列+bfs
- HDU1026 bfs+优先队列
- hdu1071Nightmare(BFS+优先队列)
- HDU2026 BFS+优先队列
- HDOJ1026 优先队列bfs
- HDU1242 BFS+优先队列
- BFS-优先队列
- 优先队列+bfs 模板
- hdu1242 BFS+优先队列
- 图解用HTML5的popstate如何玩转浏览器历史记录
- 常用布局
- Oracle数据导入导出没有想像的难吧只要做对了这些就不会出错
- 七夕杂感
- SpringMVC 常用注解 及 其用法 (上)
- csdn1780 优先队列BFS
- Java多线程
- Leetcode 65. Valid Number
- some git shell cmd
- 关于数学运算符的自加和自减
- 基于redhat的发行版本的linux系统 下 扩展Swap分区
- 在CMD下用java命令出现“找不到或无法加载主类”问题
- linux学习笔记二
- 全选按钮小案例