Description

Dpstr最近迷上了推冰块。冰地是一个n行m列的网格区域,第i行第j列的格子记为(i,j),也就是左上角为(1,1),右下角为(n,m)。每个格子可能是冰面、障碍物、减速带三者之一。其中,冰地外围(即第0行、第n+1行、第0列、第m+1列)的所有格子均有障碍物。除此之外,冰地内共有k个障碍物和减速带,其余格子为冰面。
初始时,有一个冰块位于(1,1)处。Dpstr每次可以选择上、下、左、右四个方向之一推动该冰块,推动后该冰块将一直沿此方向移动,直到冰块所在的格子为减速带,或冰块沿运动方向的下一个格子为障碍物时,冰块将停止运动。一旦冰块停在减速带上,该减速带即消失。
如下图,当n = 5,m = 5时,若冰块位于(3,1),且(3,4)处有一个障碍物,那么向右推动冰块(图1中A处),冰块将停在(3,3)(图1中B处);而如果(3,4)处不是障碍物而是减速带,那么冰块将停在(3,4)上(图2中B处),之后(3,4)处的减速带就会消失。

Solution

一看就是暴搜,一个减速带只能经过一次,这个很显然。
一开始想spfa,结果一直没有打出来。
才发现spfa是多么的麻烦。
直接bfs,然后队首的点向4周二分的找出所有点就好了。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int maxn=60007,mo=6000007,mxx=1007;
int i,j,k,l,r,t,n,m,ans,u,v,z,mid;
int num,head,tail,x,y,er;
struct node{int x,y,t;
}a[maxn],b[maxn],c[maxn];
int fang[4][2]={1,0,0,1,-1,0,0,-1};
int fan[5]={0,3,4,1,2};
bool cmp(node x,node y){return x.x<y.x||x.x==y.x&&x.y<y.y;}
bool cmp1(node x,node y){return x.y<y.y||x.y==y.y&&x.x<y.x;}
int data[maxn*100][3];
ll h[mo];
int d[4],e[4],f[4];
bool bz[4];
ll suan(int x,int y){ll z=(x-1)*m+y;return z;
}
int hash(int x,int y){ll z=suan(x,y);int o=z%mo;while(h[o]!=z&&h[o]!=0)o=(o+1)%mo;return o;
}
void jia(int a,int b,int c){if(!a)return;if(a==n&&b==m){ans=min(ans,c+1);return;}er=hash(a,b);if(h[er])return;h[er]=suan(a,b);data[++tail][0]=a,data[tail][1]=b,data[tail][2]=c+1;
}
int main(){freopen("ice.in","r",stdin);freopen("ice.out","w",stdout);//  freopen("fan.in","r",stdin);scanf("%d%d%d",&n,&m,&k);fo(i,1,k){scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);b[i]=a[i],c[i]=a[i];}sort(b+1,b+1+k,cmp);sort(c+1,c+1+k,cmp1);ans=0x7fffffff;jia(1,1,-1);while(head<tail){x=data[++head][0],y=data[head][1];memset(d,0,sizeof(d));memset(e,0,sizeof(e));l=1,r=k;while(l<r){mid=(l+r+1)/2;if(b[mid].x>x||b[mid].x==x&&b[mid].y>y)r=mid-1;else l=mid;}fo(i,max(1,l-2),l+2){if(b[i].x==x&&b[i].y<y){d[3]=b[i].x,e[3]=b[i].y+(b[i].t==0);  }if(b[i].x==x&&b[i].y>y){d[1]=b[i].x,e[1]=b[i].y-(b[i].t==0);break;}if(i==k)break;}if(!d[1])d[1]=x,e[1]=m;if(!d[3])d[3]=x,e[3]=1;l=1,r=k;while(l<r){mid=(l+r+1)/2;if(c[mid].y>y||c[mid].y==y&&c[mid].x>x)r=mid-1;else l=mid;}fo(i,max(1,l-2),l+2){if(c[i].y==y&&c[i].x<x){d[2]=c[i].x+(c[i].t==0),e[2]=c[i].y;  }if(c[i].y==y&&c[i].x>x){d[0]=c[i].x-(c[i].t==0),e[0]=c[i].y;break;}if(i==k)break;}if(!d[0])d[0]=n,e[0]=y;if(!d[2])d[2]=1,e[2]=y;fo(i,0,3)jia(d[i],e[i],data[head][2]);}printf("%d\n",ans);
}

【NOIP2016提高A组集训第7场11.4】推冰块相关推荐

  1. 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块

    题目描述 Dpstr最近迷上了推冰块.冰地是一个n行m列的网格区域,第i行第j列的格子记为(i,j),也就是左上角为(1,1),右下角为(n,m).每个格子可能是冰面.障碍物.减速带三者之一.其中,冰 ...

  2. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  3. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰 2017.10(B组)

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  4. 【JZOJ4884】【NOIP2016提高A组集训第12场11.10】图的半径

    题目描述 mhy12345学习了树的直径,于是开始研究图的半径,具体来说,我们需要在图中选定一个地方作为中心,其中这个中心有可能在路径上. 而这个中心的选址需要能够使得所有节点达到这个中心的最短路里面 ...

  5. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    题目 20 40 80 100 大致流程 code 题目 Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核 ...

  6. jzoj 4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  7. 【JZOJ4883】【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    题目描述 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取一些原子,排成 ...

  8. 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子

    题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ...

  9. JZOJ4870. 【NOIP2016提高A组集训第9场11.7】涂色游戏

    Description Data Constraint Solution 我们设f[i][j]表示当前有i个格子恰好放了j种颜色的方案数,那么f[i][j]=f[i−1][j−1]∗(p−(j−1)) ...

最新文章

  1. ADAS越来越热,这家公司为何能俾睨群雄
  2. shell远程执行命令
  3. .net Redis缓存优化提高加载速度和服务器性能(一)
  4. 45 CO配置-控制-利润中心会计-维护控制范围设置
  5. Python模拟登录CSDN
  6. Spring Boot系列教程六:日志输出配置log4j2
  7. android图片选择器实现说明
  8. oracle客户端登录失败,Win7系统配置Oracle客户端连接失败的解决方法
  9. 自定义firefox账户服务器出错,我在确认 Firefox 账户时出现了问题
  10. python编写鸡兔同笼程序_编写程序,分享解鸡兔同笼问题? 用Python分享多笼鸡兔同笼...
  11. 指数基金的正确购买姿势
  12. Chrome开发者工具不完全指南:(三、性能篇)
  13. 迁移学习系列--方法篇
  14. Gitlab搭建及常用命令
  15. 配置vimrc时各种出错,第n+1行永远报错:unmatched ' 的解决办法!!!
  16. 栈和队列以及线性表的区别
  17. oracle查运行sql语句,查询Oracle正在执行的SQL语句
  18. 广东省工业和信息化厅财政专项资金支持项目验收管理办法通知
  19. 程序员应该如何读好书?
  20. airtest-poco无限重启

热门文章

  1. 毫安时mAh与瓦时Wh的计算
  2. js如何实现扫描身份证识别_百度AI身份证识别demo,使用js提交图片数据
  3. IOS OpenGL 学习 (一)
  4. 程序员发展与晋升攻略
  5. Linux网络编程-很全面
  6. 基因卡方列联表P值检验——相关系数图形
  7. html下一页怎么实现,JS代码实现页面切换效果(上一页+具体页+下一页)
  8. eslint,prettier
  9. FFT_频谱分析(数字信号处理)
  10. 关于 react 中 swiper 版本过高(7.0.x)导致的问题