飞行
来源:互联网 发布:科比保罗联手知乎 编辑:程序博客网 时间:2024/06/11 20:49
从起点到终点,又不能踩在上面的点,只能飞越过去,飞越的距离有一个最大值,求最少时间。
广度优先搜索。
#include<cstdio>#include<string.h>int queue[1000010][3],mark[110][110][110];char map[110][110];int m,n,d;const int dir[4][2]={-1,0,1,0,0,-1,0,1};void init(){int i,j;char s[110];scanf("%d%d%d",&m,&n,&d);for(i=1;i<=m;i++){scanf("%s",s);for(j=1;j<=n;j++)map[i][j]=s[j-1];}}int work(){int i,j,k,total,tx,ty,td,tempx,tempy,tempd;queue[1][0]=1;queue[1][1]=1;queue[1][2]=d;mark[1][1][d]=1;i=total=1;while(i<=total){tx=queue[i][0];ty=queue[i][1];td=queue[i][2];for(j=0;j<4;j++){tempx=tx+dir[j][0];tempy=ty+dir[j][1];if(tempx>0&&tempx<=m&&tempy>0&&tempy<=n&&map[tempx][tempy]=='P'&&!mark[tempx][tempy][td]){queue[++total][0]=tempx;queue[total][1]=tempy;queue[total][2]=td;mark[tempx][tempy][td]=mark[tx][ty][td]+1;if(tempx==m&&tempy==n)return mark[tempx][tempy][td];}tempx=tx;tempy=ty;tempd=td;for(k=1;k<=td;k++){tempx+=dir[j][0];tempy+=dir[j][1];tempd--;if(tempx<=0||tempx>m||tempy<=0||tempy>n)break;if(map[tempx][tempy]=='P'&&!mark[tempx][tempy][tempd]){queue[++total][0]=tempx;queue[total][1]=tempy;queue[total][2]=tempd;mark[tempx][tempy][tempd]=mark[tx][ty][td]+1;if(tempx==m&&tempy==n)return mark[tempx][tempy][tempd];}}}i++;}return -1;}int main(){int ans;init();ans=work();if(ans>0)printf("%d\n",ans-1);else printf("impossible\n");return 0;}
阅读全文
0 0
- 飞行
- 第一次飞行
- 飞行人!
- 飞行应力
- 飞行动画
- 飞行状态
- 飞行系统
- 飞行棋
- 飞行棋
- 飞行城堡
- 飞行棋
- 飞行棋
- 飞行模式
- 模拟飞行
- 飞行常用英语词汇
- 在时间中飞行
- 飞行游戏A计划
- 直升机飞行机理
- sscanf的高级用法
- CSU1777-大还是小?-模拟
- 用JQuery写的一个简单的验证码功能
- CSU1104-盒子游戏-博弈论
- java线程池线程回收
- 飞行
- CSU1549-Navigition Problem-几何简单题
- 84-98_实战项目详细说明
- Android_高级空间_2
- CSU1162-Balls in the Boxes-快速幂、数论
- php学习心得(一)
- String与StringBuffer的区别(最全比较)
- CSU1163-寒衣调-拓展欧几里得、乘法逆元
- CSU1640-机智的刷题方式-贪心or背包