链接:https://www.nowcoder.com/acm/contest/105/F
来源:牛客网

有q个单向传送阵,每个传送阵各有一个入口和一个出口,入口和出口都在迷宫的格子里,当走到或被传送到一个有传送阵入口的格子时,小明可以选择是否开启传送阵。如果开启传送阵,小明就会被传送到出口对应的格子里,这个过程会花费3秒;如果不开启传送阵,将不会发生任何事情,小明可以继续向上下左右四个方向移动。

一个格子可能既有多个入口,又有多个出口,小明可以选择任意一个入口开启传送阵。使用传送阵是非常危险的,因为有的传送阵的出口在陷阱里,如果小明使用这样的传送阵,那他就会死亡。也有一些传送阵的入口在陷阱里,这样的传送阵是没有用的,因为小明不能活着进入。请告诉小明活着到达目的地的最短时间。

输入描述:

有多组数据。对于每组数据:
第一行有三个整数n,m,q(2≤ n,m≤300,0≤ q ≤ 1000)。
接下来是一个n行m列的矩阵,表示迷宫。
最后q行,每行四个整数

表示一个传送阵的入口在x

1

行y

1

列,出口在x

2

行y

2

列。

输出描述:

如果小明能够活着到达目的地,则输出最短时间,否则输出-1。
示例1

输入

5 5 1
..S..
.....
.###.
.....
..T..
1 2 3 3
5 5 1
..S..
.....
.###.
.....
..T..
3 3 1 2
5 5 1
S.#..
..#..
###..
.....
....T
0 1 0 2
4 4 2
S#.T
.#.#
.#.#
.#.#
0 0 0 3
2 0 2 2

输出

6
8
-1
3
bfs,注意,可能通过不止一个传送阵
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
struct node
{
int x,y,step;
node(int x=,int y=,int t=):x(x),y(y),step(step){};
bool operator<(const node a) const
{
return a.step<step;
}
}ans,pos;
int dir[][]={{,},{,},{,-},{-,}};
int n,m,k,xs,ys;
int dis[][];
char a[][];
int xa,xb,ya,yb;
vector<node>vis[][];
int bfs(int u,int v)
{
priority_queue<node>q;
memset(dis,INF,sizeof(dis));
ans.x=u;ans.y=v;
ans.step=;
dis[u][v]=;
q.push(ans);
while(!q.empty())
{
pos=q.top();
q.pop();
if(a[pos.x][pos.y]=='T') return pos.step;
for(int i=;i<vis[pos.x][pos.y].size();i++)
{
ans=vis[pos.x][pos.y][i];
if(dis[ans.x][ans.y]>pos.step+)
{
ans.step=pos.step+;
dis[ans.x][ans.y]=pos.step+;
q.push(ans);
}
}
for(int i=;i<;i++)
{
ans.x=pos.x+dir[i][];
ans.y=pos.y+dir[i][];
ans.step=pos.step+;
if(ans.x>= && ans.x<n && ans.y>= && ans.y<m && a[ans.x][ans.y]!='#' && dis[ans.x][ans.y]>ans.step)
{
dis[ans.x][ans.y]=pos.step+;
q.push(ans);
}
}
}
return -;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=;i<n;i++)
{
scanf("%s",&a[i]);
for(int j=;j<m;j++)
{
vis[i][j].clear();
if(a[i][j]=='S') xs=i,ys=j;
}
}
for(int i=;i<k;i++)
{
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
if(a[xa][ya]!='#' && a[xb][yb]!='#')
vis[xa][ya].push_back(node(xb,yb));
}
int cnt=bfs(xs,ys);
printf("%d\n",cnt);
}
return ;
}#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 0x3f3f3f3f
#define mem(a) ((a,0,sizeof(a)))
typedef long long ll;
struct node
{
int x,y,step;
node(int x=,int y=,int t=):x(x),y(y),step(step){};
bool operator<(const node a) const
{
return a.step<step;
}
}ans,pos;
int dir[][]={{,},{,},{,-},{-,}};
int n,m,k,xs,ys;
int dis[][];
char a[][];
int xa,xb,ya,yb;
vector<node>vis[][];
int bfs(int u,int v)
{
priority_queue<node>q;
memset(dis,INF,sizeof(dis));
ans.x=u;ans.y=v;
ans.step=;
dis[u][v]=;
q.push(ans);
while(!q.empty())
{
pos=q.top();
q.pop();
if(a[pos.x][pos.y]=='T') return pos.step;
for(int i=;i<vis[pos.x][pos.y].size();i++)
{
ans=vis[pos.x][pos.y][i];
if(dis[ans.x][ans.y]>pos.step+)
{
ans.step=pos.step+;
dis[ans.x][ans.y]=pos.step+;
q.push(ans);
}
}
for(int i=;i<;i++)
{
ans.x=pos.x+dir[i][];
ans.y=pos.y+dir[i][];
ans.step=pos.step+;
if(ans.x>= && ans.x<n && ans.y>= && ans.y<m && a[ans.x][ans.y]!='#' && dis[ans.x][ans.y]>ans.step)
{
dis[ans.x][ans.y]=pos.step+;
q.push(ans);
}
}
}
return -;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=;i<n;i++)
{
scanf("%s",&a[i]);
for(int j=;j<m;j++)
{
vis[i][j].clear();
if(a[i][j]=='S') xs=i,ys=j;
}
}
for(int i=;i<k;i++)
{
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
if(a[xa][ya]!='#' && a[xb][yb]!='#')
vis[xa][ya].push_back(node(xb,yb));
}
int cnt=bfs(xs,ys);
printf("%d\n",cnt);
}
return ;
}

2018年湘潭大学程序设计竞赛 maze(bfs)的更多相关文章

  1. 2018年湘潭大学程序设计竞赛 F - maze

    把点抽出来 跑个最短路就好啦. #include<bits/stdc++.h> #define LL long long #define pii pair<int,int> # ...

  2. 2018年湘潭大学程序设计竞赛G又见斐波那契

    链接:https://www.nowcoder.com/acm/contest/105/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  3. 牛客网-2018年湘潭大学程序设计竞赛-F

    题目链接:https://www.nowcoder.com/acm/contest/105/F 解题思路:这道题第一眼直接思路就是搜索,但想了半天没想到有什么好办法搜,然后就转成最短路写了, 因为多入 ...

  4. 2018年湘潭大学程序设计竞赛 H统计颜色

    链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  5. 2018年湘潭大学程序设计竞赛 G- 又见斐波那契

    推一推矩阵直接快速幂. #include<bits/stdc++.h> #define LL long long #define pii pair<int,int> #defi ...

  6. 2018年湘潭大学程序设计竞赛 E 吃货

    题目描述 作为一个标准的吃货,mostshy又打算去联建商业街觅食了.混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种 ...

  7. 2018年湘潭大学程序设计竞赛G又见斐波那契(矩阵快速幂)

    题意 题目链接 Sol 直接矩阵快速幂 推出来的矩阵应该长这样 \begin{equation*}\begin{bmatrix}1&1&1&1&1&1\\1 & ...

  8. 2018年湘潭大学程序设计竞赛 Fibonacci进制

    Fibonacci数是非常有名的一个数列,它的公式为 f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=2.  我们可以把任意一个数x表示成若干不相同的Fibonacci数的和, 比如说1 ...

  9. 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. C++ STL之list具体解释

    list容器是一个双向链表,能够高效地进行插入删除元素. 构造函数 list<Elem> c;//空list list<int> c(3);//创建一个含有三个默认值是0的元素 ...

  2. nyoj--138--找球号(二)(hash+邻接表)

    找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=1 ...

  3. 新型查询系统impala

    这羊头很酷... Apache Impala是Apache Hadoop的开源本地分析数据库.Impala由Cloudera,MapR,Oracle和Amazon提供. 在Hadoop上进行BI风格的 ...

  4. IOS系统设置页面跳转

    目录: 跳转 iOS10- 版本跳转url转 iOS10+ 版本跳转url转 跳转符 跳转到系统设置界面代码: // 自己应用的设置界面:url = UIApplicationOpenSettings ...

  5. MySQL内置函数uuid和uuid_short

    MySQL的uuid这个函数.简要介绍一下. 用法 简单看到,这个值,每次执行都是不同的. 生成规则 第1 2 3 段是与时间有关的. time_low.time_mid.time_high_and_ ...

  6. 有关马氏距离和hinge loss的学习记录

    关于度量学习,之前没有看太多相关的文献.不过南京的周老师的一篇NIPS,确实把这个问题剖析得比较清楚. Mahalanobis距离一般表示为d=(x-y)TM(x-y),其中x和y是空间中两个样本点, ...

  7. Android学习——LinearLayout布局实现居中、左对齐、右对齐

    android:orientation="vertical"表示该布局下的元素垂直排列: 在整体垂直排列的基础上想要实现内部水平排列,则在整体LinearLayout布局下再创建一 ...

  8. NEC芯片特别说明

    NEC芯片注意点: 1.堆栈和RAM共用,而且是程序中自定义堆栈的空间,堆栈是向下递减堆栈. 2.中断中标志位的清除可以不用手动清除,在中断服务程序中运行任何一条指令后自动清除. 3.中断服务程序有且 ...

  9. codeforces 493 C Vasya and Basketball

    题意:给出三分线的值d,分别有两支队伍,如果小于等于d,得2分,如果大于d,得三分,问使得a-b最大时的a,b 一看到题目,就想当然的去二分了----啥都没分出来---55555555 后来才知道不能 ...

  10. lftp简单使用

    连接服务器: lftp -e "参数;" "username":"password"@"ip" -p port lftp ...