hdu4198
2015-08-07 20:16
225 查看
链接:点击打开链接
题意:给出三个数h,w,d,代表地图长h,宽w,‘#’不可走,'S'为起点,‘.’花费一个单位时间,'@'花费d+1个单位时间,问走出迷宫最少花费多少时间(走到迷宫边界即为走出迷宫,本题肯定有解)
代码:
题意:给出三个数h,w,d,代表地图长h,宽w,‘#’不可走,'S'为起点,‘.’花费一个单位时间,'@'花费d+1个单位时间,问走出迷宫最少花费多少时间(走到迷宫边界即为走出迷宫,本题肯定有解)
代码:
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> #include <queue> using namespace std; char str[505][505]; struct node{ int x,y,sum; }; struct cmp{ //优先队列优先级 bool operator()(node a,node b){ return a.sum>b.sum; } }; int m,n,d; int xx[]={1,0,-1,0}; //搜索的四个方向向量 int yy[]={0,-1,0,1}; int bfs(node st){ priority_queue<node,vector<node>,cmp>que; node cur,temp; int i; que.push(st); while(que.size()){ cur=que.top();que.pop(); if(cur.x==0||cur.x==m-1||cur.y==0||cur.y==n-1) //当走到边界时返回走的值 return cur.sum+1; for(i=0;i<4;i++){ temp.x=cur.x+xx[i]; temp.y=cur.y+yy[i]; if(temp.x>=0&&temp.x<m&&temp.y>=0&&temp.y<n) if(str[temp.x][temp.y]!='#'){ if(str[temp.x][temp.y]=='.') temp.sum=cur.sum+1; else if(str[temp.x][temp.y]=='@') temp.sum=cur.sum+d+1; que.push(temp); str[temp.x][temp.y]='#'; //走过之后就变成'#',面的再开一个二维数组 } //标记是否走过 } } } int main(){ int i,j,t; node st; scanf("%d",&t); while(t--){ scanf("%d%d%d",&m,&n,&d); for(i=0;i<m;i++) for(j=0;j<n;j++){ cin>>str[i][j]; if(str[i][j]=='S') //记录起点 st.x=i,st.y=j,st.sum=0; } printf("%d\n",bfs(st)); } return 0; }
相关文章推荐
- FFmpeg Windows 开发环境简单搭建 教程
- 线程的三种创建方法
- 验证邮箱是否存在原理
- java Math.floor,Math.ceil,Math.rint,Math.round用法详解
- uvalive 3616
- 浅谈对主成分分析(PCA)算法的理解
- C#高级编程----反射的小结
- UVa-12166 Equilibrium Mobile
- Nginx负载均衡配置实例详解
- (素材源码)swanzhu学IOS(三)打飞机
- 在visual studio 2010中调用ffmpeg
- 伊斯坦布尔之旅第一站:韩国仁川机场免费中转旅游
- Linux 下面安装redis
- Android之SDK如何更新
- NSURLConnection使用
- 微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)
- HDU2303(数论)大整数求余+素数筛选
- 阿里云服务器ubuntu安装java运行环境
- 蓝牙的RSSI转换为信号强度百分百
- HDU - 4287 Intelligent IME 字典树