其实,这道题不用long long也能AC。


题意是给你一个矩阵,有一些格子被点亮有一些没有,每一次只能在被点亮的格子上面走。

然后你每一次都可以选择点亮一行或一排(非永久),现在问你最少点多少次可以走到终点?


思路十分好想。

我们把相邻的格子边权设为0,把不相邻但只差一行的格子之间边权设为1。(其他情况都不能直接到达)

然后跑一下SPFA就可以了。

但是需要考虑一个特例:终点有没有被点亮。

如果点了的话那没关系,没点的话得把(n+1,m+1)设为点亮的点。(要不然我们走不到终点不是吗)


AC代码如下:

11149ms/192kb

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
namespace StandardIO{
template<typename T>inline void read(T &x){
x=0;T f=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
x*=f;
}
template<typename T>inline void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>=10)write(x/10);
putchar(x%10+'0');
}
}
using namespace StandardIO;
namespace Solve{
const int N=10100;
const int INF=0x3f3f3f3f;
int n,m,k;
struct node{
int from,to;
}edge[N];
int dis[N],vis[N];
inline int spfa(){
for(register int i=1;i<=k;++i)dis[i]=INF;
queue<int>q;q.push(1);
vis[1]=1,dis[1]=0;
while(!q.empty()){
int to=q.front();q.pop();
vis[to]=0;
for(register int i=1;i<=k;++i){
if(to==i)continue;
int val=INF;
int dx=abs(edge[to].from-edge[i].from),dy=abs(edge[to].to-edge[i].to);
if(dx+dy==1)val=0;
else if(dx<=2||dy<=2)val=1;
if(dis[i]>dis[to]+val){
dis[i]=dis[to]+val;
if(!vis[i]){
q.push(i),vis[i]=1;
}
}
}
}
if(dis[k]!=INF)return dis[k];
return -1;
}
inline void solve(){
read(n),read(m),read(k);
int flag=0;
for(register int i=1;i<=k;++i){
read(edge[i].from),read(edge[i].to);
if(edge[i].from==n&&edge[i].to==m)flag=1;
}
if(!flag)edge[++k].from=n+1,edge[k].to=m+1;
write(spfa());
}
}
using namespace Solve;
int main(){
solve();
}

最新文章

  1. Centos 6.5 Zookeeper 安装
  2. CSS2样式中选择器的介绍
  3. php代码美化/格式化 还原 -问题
  4. BZOJ 4245: [ONTAK2015]OR-XOR
  5. sql篇,动态合并数据
  6. blade快速使用指南
  7. C语言样式的文件操作函数
  8. Android--多选自动搜索提示
  9. php初探
  10. DFT basics
  11. NSSet类型 以及与NSArray区别
  12. python 简单示例说明os.walk和os.path.walk的不同
  13. opencv2对读书笔记——使用均值漂移算法查找物体
  14. 抓取锁的sql语句-第三次修改
  15. PHP 类中的常量
  16. python的operator.itemgetter(&#39;click&#39;)用于定义获取&#39;click&#39;项的函数
  17. iOS平台添加Google Admob -1/2(Unity3D开发之七)
  18. asp.net mvc学习(Vs技巧与Httpcontext)
  19. maven打包时报错:-source 1.5 中不支持 diamond 运算符
  20. Linux终端小技巧

热门文章

  1. js 现给数字加三位一逗号间隔的种方法
  2. Spring自带字符编码过滤器
  3. C++异常与析构函数及构造函数
  4. 【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】
  5. php PDO连接mysql
  6. 近200篇机器学习&amp;amp;深度学习资料分享
  7. QFileSystemModel只显示名称,不显示size,type,modified
  8. C语言的长处和缺点
  9. page template in kentico
  10. block的一些注意事项