[bfs] Jzoj P3522 迷宫花园

Description

给定一个一定存在从起点到终点的路径的四联通迷宫。已知Tar左右方向移动的时间为1,上下移动的时间为未知实数v。求当Tar从起点到终点的最短移动时间为已知实数L时,未知实数v是多少。

Input

输入数据包含多个测试点。第一行为一个整数T,表示测试点的数目。

对于每一个测试点,第一行包含实数L和两个整数R,C。R为迷宫的上下长度,C为迷宫的左右长度。

之后的R行,每行包含C个字符。其中空格表示空地,S表示起点,E表示终点,#表示围墙。

Output

对于每一个测试点,在单独的一行内输出未知实数v,输出保留5位小数。

Sample Input

2
2.5 4 5
#####
#S  #
#  E#
#####
21 13 12############
#S##     #E#
# ##  #  # #
#   # #  # #
### # #  # #
#   # #  # #
#  ## #  # #
##  # #  # #
### # #  # #
##  # #  # #
#  ## #    ##     #    #
############

Sample Output

0.50000
0.21053

Data Constraint

20%的数据,1≤ R,C ≤ 10。

100%的数据,1≤ R,C ≤ 100,0≤ v <10。

题解

  • 这题100*100的矩阵,直接bfs就好了
  • 有一个地方要注意的是,如果当前走到终点,但是v比左右移动的距离还要短,显然是不行的,这时要把vis[终点]=0

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 int T,n,m,head,tail,px,py,qx,qy,state[20010][5],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
 6 bool vis[110][110];
 7 char a[110][110];
 8 double l;
 9 bool pd(int x,int y)
10 {
11     if (x<=0||y<=0||x>n||y>m||vis[x][y]||a[x][y]==‘#‘) return false;
12     return true;
13 }
14 void bfs()
15 {
16     head=0,tail=1,state[1][1]=px,state[1][2]=py,vis[px][py]=1;
17     while (head<tail)
18     {
19         head++;
20         for (int i=0;i<4;i++)
21         {
22             int x=state[head][1]+dx[i],y=state[head][2]+dy[i];
23             if (pd(x,y))
24             {
25                 tail++,state[tail][1]=x,state[tail][2]=y,vis[x][y]=1;
26                 if (x==state[head][1]) state[tail][3]=state[head][3]+1,state[tail][4]=state[head][4];
27                 else state[tail][3]=state[head][3],state[tail][4]=state[head][4]+1;
28                 if (x==qx&&y==qy&&l>=state[tail][3])
29                 {
30                     printf("%.5lf\n",(l-state[tail][3])/state[tail][4]);
31                     return;
32                 }
33                 if (x==qx&&y==qy) tail--,vis[qx][qy]=0;
34             }
35         }
36     }
37 }
38 int main()
39 {
40     freopen("maze.in","r",stdin),freopen("maze.out","w",stdout);
41     scanf("%d",&T);
42     while (T--)
43     {
44         memset(vis,0,sizeof(vis)),memset(state,0,sizeof(state));
45         scanf("%lf%d%d",&l,&n,&m);
46         for (int i=1;i<=n;i++)
47         {
48             scanf("\n");
49             for (int j=1;j<=m;j++)
50             {
51                 a[i][j]=getchar();
52                 if (a[i][j]==‘S‘) px=i,py=j;
53                 if (a[i][j]==‘E‘) qx=i,qy=j;
54             }
55         }
56         bfs();
57     }
58 }

原文地址:https://www.cnblogs.com/Comfortable/p/9826442.html

时间: 2024-10-09 08:35:38

[bfs] Jzoj P3522 迷宫花园的相关文章

[二分][记搜]JZOJ 3522 迷宫花园

Description 给定一个一定存在从起点到终点的路径的四联通迷宫.已知Tar左右方向移动的时间为1,上下移动的时间为未知实数v.求当Tar从起点到终点的最短移动时间为已知实数L时,未知实数v是多少. Input 输入数据包含多个测试点.第一行为一个整数T,表示测试点的数目. 对于每一个测试点,第一行包含实数L和两个整数R,C.R为迷宫的上下长度,C为迷宫的左右长度. 之后的R行,每行包含C个字符.其中空格表示空地,S表示起点,E表示终点,#表示围墙. Output 对于每一个测试点,在单独

二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 10.28 9 9 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ##E # ######### 4.67 9 9 ######### # ## ## ### #S# # # # E ## # # ##### # ## ### # ##### # # # # ######### 39.06 9 9 ######### # # # # # # # #

ACM:图的BFS,走迷宫

题目: 一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上.下.左.右移动到相邻单元格.任何时候都不能在障碍格中,也不能走到迷宫之外.起点和终点保证是空地. 分析:图的BFS. #include <iostream> #include <string> #include <queue> using namespace std; const int MAXN

BFS 典型的迷宫问题

这个是BFS搜索的典型问题,好好整理一下: 给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.易得可以用1将迷宫围起来避免边界问题.本题采用BFS算法给出解.注意,利用BFS算法给出的路径必然是一条最短路径. input: 1 6 8 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 0 0

(图 BFS)走迷宫

题目: 给一个迷宫,求出从起点到终点的路径.迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角: 1 6 5 2 1 1 0 1 1 3 1 0 1 1 1 4 1 0 1 0 0 5 1 0 1 1 1 6 1 1 1 0 1 7 1 1 1 1 1 解析: 其实就是图的广度优先遍历. 代码及运行结果: 1 #include <iostream> 2 #include <queue> 3 #inc

简单BFS +打印路径 迷宫问题 POJ - 3984

#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<stack> #include<queue> using namespace std; int nex[4][2]= { {0,1},{1,0},{0,-1},{-1,0} }; typedef struct { int x,y; } Point; int a[10][10],

POJ 2049-Finding Nemo(三维bfs解决类迷宫问题)

Finding Nemo Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7902   Accepted: 1827 Description Nemo is a naughty boy. One day he went into the deep sea all by himself. Unfortunately, he became lost and couldn't find his way home. Therefo

[dfs][bfs] Jzoj P5806 简单的操作

Description 从前有个包含n个点,m条边,无自环和重边的无向图.对于两个没有直接连边的点u;v,你可以将它们合并.具体来说,你可以删除u;v及所有以它们作为端点的边,然后加入一个新点x,将它与所有在原图中与u或v有直接连边的点连边.你需要判断是否能通过若干次合并操作使得原图成为一条链,如果能,你还需要求出这条链的最大长度 Input 从文件merge.in中读入数据.第一行两个正整数n;m,表示图的点数和边数.接下来m行,每行两个正整数u;v,表示u和v之间有一条无向边 Output

bfs简单应用----迷宫问题

[week2-A] 东东有一张地图,想通过地图找到妹纸.地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0.既然已经知道了地图,那么东 东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线. Input 输入是一个5 × 5的二维数组,仅由0.1两数字组成,表示法阵地图. Output 输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示.数据保证有唯一解. Sample Input 0 1 0 0 00 1 0 1 00 1 0