CF #327 DIV2 D、E
2015-10-30 21:52
363 查看
两题都不难。
对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动。假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变化的时间点即可。其实很明显的二分。。
View Code
对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动。假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变化的时间点即可。其实很明显的二分。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; char str[1005][1005]; int n,m; int dis[4][1005][1005]; struct Node{ int x,y; Node(){} Node(int xx,int yy){ x=xx,y=yy; } }; int dir[4][2]={ {0,1}, {1,0}, {-1,0}, {0,-1} }; int p[4]; bool ok(int x,int y){ if(x<1||x>n||y<1||y>m) return false; return true; } void slove(int ind){ queue<Node>que; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(str[i][j]=='0'+ind) que.push(Node(i,j)),dis[ind][i][j]=0,p[ind]=0; } } Node tmp,nxt; while(!que.empty()){ tmp=que.front(); que.pop(); for(int k=0;k<4;k++){ nxt.x=tmp.x+dir[k][0]; nxt.y=tmp.y+dir[k][1]; if(!ok(nxt.x,nxt.y)) continue; if(dis[ind][nxt.x][nxt.y]!=-1) continue; if(str[nxt.x][nxt.y]=='#') continue; dis[ind][nxt.x][nxt.y]=dis[ind][tmp.x][tmp.y]+1; if(str[nxt.x][nxt.y]>='1'&&str[nxt.x][nxt.y]<='3'){ if(str[nxt.x][nxt.y]=='1'&&p[1]==-1) p[1]=dis[ind][nxt.x][nxt.y]; if(str[nxt.x][nxt.y]=='2'&&p[2]==-1) p[2]=dis[ind][nxt.x][nxt.y]; if(str[nxt.x][nxt.y]=='3'&&p[3]==-1) p[3]=dis[ind][nxt.x][nxt.y]; } que.push(Node(nxt.x,nxt.y)); } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){ scanf("%s",str[i]+1); } int ans=-1; memset(dis[1],-1,sizeof(dis[1])); memset(p,-1,sizeof(p)); slove(1); if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); memset(dis[2],-1,sizeof(dis[2])); memset(p,-1,sizeof(p)); slove(2); if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); memset(dis[3],-1,sizeof(dis[3])); memset(p,-1,sizeof(p)); slove(3); if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(dis[1][i][j]==-1) continue; if(dis[2][i][j]==-1) continue; if(dis[3][i][j]==-1) continue; ans=ans==-1?dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2:min(ans,dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2); } } printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- 知乎上对 国内机器视觉行业的发展的 讨论-经典
- hdu1408 盐水的故事
- Q-1
- 问题记录:Fragment中addtoBackStack无效的问题
- 最小二乘拟合详解
- Hadoop-3
- 接口和抽象类有什么区别
- 数值的整数次方
- TYVJ P1373 石子采集
- 栈的小结
- centos配置网卡
- DSP、嵌入式、软件等笔试
- nyoj 523 密室逃亡
- POJ 3522 ——Slim Span——————【最小生成树、最大边与最小边最小】
- Android 拦截WebView加载URL,控制其加载CSS、JS资源
- 最佳vim技巧
- Zabbix通过JMX监控tomcat
- 用C语言打印一个菱形
- 最短路径_Til the Cows Come Home (Poj 2387)
- CSS背景