Skiing POJ 3037 很奇怪的最短路问题

题意

题意:你在一个R*C网格的左上角,现在问你从左上角走到右下角需要的最少时间.其中网格中的任意两点的时间花费可以计算出来.

解题思路

这个需要发现一个规律,就是从左上角到其他任意一点,无论选择哪条路径,到达该点的速度都是固定的。

例如对于下面的一个矩阵:

1 5 3

6 3 5

2 4 3

可以发现我们想要计算数值为2的点的速度的话,$$v_2=v_12^{1-2}$$,路径是这样的$$1->6->2$$, 然后$$v_2=v_12{1-6}*2{6-2}=v_12^{1-2}$$。这样我们就可以知道其他点的速度。

代码实现也是很奇特,这个是参考的大佬 \(lhm\) 同学代码,很厉害的同学,后来转了临床医学,还想和他组队打打比赛呢,不过也祝福他,能够找到自己喜欢的专业,毕竟自己也是转专业进的计算机专业,对于转专业自己也是有感受的。

代码实现

#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
struct node{
int x,y;
double time;
bool operator < (const node& tmp) const
{
return time > tmp.time;
}
};
double v;
int n,m;
int book[110][110],a[110][110];
priority_queue<node>q;
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs()
{
while(!q.empty()) q.pop();
q.push((node){1,1,0.0});
while(!q.empty())
{
node t=q.top(); q.pop();
if(book[t.x][t.y]==1) continue;
book[t.x][t.y]=1;
if(t.x==n&&t.y==m)
{
printf("%.2f\n",t.time);
return ;
}
for(int i=0;i<4;i++)
{
int tx=t.x+next[i][0];
int ty=t.y+next[i][1];
if(tx>=1&&tx<=n&&ty<=m&&ty>=1&&book[tx][ty]==0)
{
double tt=t.time+1.0/(pow(2.0,(a[1][1]-a[t.x][t.y]))*v);
q.push((node){tx,ty,tt}); //注意这里加入的点没有进行标记
}
}
}
return ;
}
int main()
{
while(scanf("%lf%d%d", &v, &n, &m)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
bfs();
}
return 0;
}

最新文章

  1. ultraedit正则使用
  2. HDU 4741
  3. (剑指Offer)面试题31:连续子数组的最大和
  4. linux常用命令详解
  5. 转载JQuery 中empty, remove 和 detach的区别
  6. Http record java
  7. [置顶] 编程模仿boost::function和boost::bind
  8. springMVC和spring的集成
  9. cocos2d-x action执行完毕的回调
  10. opencv学习之路(19)、直方图
  11. Python之SGDRegressor
  12. Linux内核 设备树操作常用API
  13. 详谈ASP.NET的DataReader对象
  14. ubuntu 使用小技巧
  15. HDU 1427 速算24点 (深搜)
  16. [转载]打造自己喜欢的Linux桌面----archlinux
  17. Fort.js – 时尚、现代的进度提示效果
  18. DataFrames与RDDs的相互转换
  19. ubuntu关闭系统自动检测错误
  20. ajax拖拽上传文件

热门文章

  1. java 实现 图片与byte 数组互相转换
  2. LeeCode - 移动零
  3. JUnit——Annotation
  4. 神经网络内在逻辑:没打开的AI“黑匣子”
  5. week4 作业
  6. 【转】ACM-数学总揽
  7. bestcoder#9--1001--Lotus and Characters
  8. 安装浏览器的vue插件
  9. VC CString,int,string,char*之间的转换
  10. FreeBSD上安装Cassandra 3.10