Pond Skater
题目
Snuke,水上平衡车,住在一个矩形池塘,可以看成 H 列 W 行,(i, j) 表示第 i 列第 j 行。池塘里长着荷叶,荷叶是不能进入的。如果 cij 是 @,表示荷叶。如果 cij 是 .,表示不是荷叶。
Snuke 每次可以向北、东、南、西的任意同一个方向移动1 ~ K 步,但是不能通过荷叶,同时也不能移动到池塘外。
给我们起点坐标 (x1, y1) 和终点坐标 (x2, y2),要求我们找到最小的移动次数。如果不能到达,输出 -1。
\(1 ≤ H,W,K ≤ 10^6\)
\(H × W ≤ 10^6\)
题目分析
对于数据分析,可以把矩阵转化为一条链,而链的长度不会超过\(1e6\),这样解决了矩阵的访问
考虑对整个问题BFS,对答案记忆化,实际上每一个格子都会被访问多次,但在BFS拓展时会有操作4*k次,于是需要对BFS剪枝
首先,如果超出边界便不用走完k步
如果当前到达的步数会大于目前格子的最小步数,说明,接下的步数,都可以用格子的最小步数+1所替换,怎样都比现在的优,所以可以break
如果当前到达的步数会等于目前格子的最小步数,那这一步就没有走的必要,但当前格子的步数可能为另一条路转移,所以k步要继续走
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
int n,m,k;
int mp[MAXN];
char s[MAXN];int sx,sy,tx,ty;
int get(int x,int y)
{
return (x-1)*m+y;
}
struct node{
int x,y;
int step;
};
int zfx[5]={0,0,1,-1};
int zfy[5]={1,-1,0,0};
int vis[MAXN];
int Bfs()
{
memset(vis,0x3f,sizeof(vis));
queue<node>q;
node nowx;
nowx.step=0;
nowx.x=sx;
nowx.y=sy;
vis[get(nowx.x,nowx.y)]=0;
q.push(nowx);
while(q.size())
{
node temp=q.front();
q.pop();
if(temp.x==tx&&temp.y==ty)
{
return temp.step;
}
for(int j=0;j<4;j++)
{
for(int i=1;i<=k;i++)
{
int nowxs=temp.x+i*zfx[j];
int nowys=temp.y+i*zfy[j];
if(nowxs>n||nowys>m||nowxs<1||nowys<1)
{
break;
}
if(mp[get(nowxs,nowys)])
{
break;
}
node now;
now.x=nowxs;
now.y=nowys;
now.step=temp.step+1;
if(now.step>vis[get(now.x,now.y)])
{
break;
}
if(now.step==vis[get(now.x,now.y)])
{
continue;
}
vis[get(now.x,now.y)]=now.step;
q.push(now);
}
}
}
return -1;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
scanf("%d %d %d %d",&sx,&sy,&tx,&ty);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=m;j++)
{
if(s[j]=='@')
{
mp[get(i,j)]=1;
}
}
}
printf("%d",Bfs());
}
Pond Skater的更多相关文章
- AtCoder Beginner Contest 170
比赛链接:https://atcoder.jp/contests/abc170 A - Five Variables 题意 $5$ 个数中有 $1$ 个 $0$,判断是第几个. 代码 #include ...
- BZOJ 1632: [Usaco2007 Feb]Lilypad Pond
题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 390 Solved: 109[ ...
- 1632: [Usaco2007 Feb]Lilypad Pond
1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 404 Solved: 118[Sub ...
- bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond
P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽 ...
- [USACO07FEB] Lilypad Pond
https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...
- 最短路【洛谷P1606】 [USACO07FEB]荷叶塘Lilypad Pond
P1606 [USACO07FEB]荷叶塘Lilypad Pond 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令 ...
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告
P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...
- P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)
P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...
- Gym - 101670B Pond Cascade(CTU Open Contest 2017 贪心,二分)
题目: The cascade of water slides has been installed in the park recently and it has to be tested. The ...
随机推荐
- 【Services】【Web】【LVS】lvs基础概念
1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...
- js 长按鼠标左键实现溢出内容左右滚动滚动
var nextPress, prevPress; // 鼠标按下执行定时器,每0.1秒向左移一个li内容的宽度 function nextDown() { nextPress = setInterv ...
- Python 3 字典(Dictionary)
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...
- kubeadm安装k8s集群
安装kubeadm kubectl kubelet 对于Ubuntu/debian系统,添加阿里云k8s仓库key,非root用户需要加sudo apt-get update && a ...
- 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)
1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...
- Jenkins监控
目录 一.Monitoring插件 二.Prometheus监控 一.Monitoring插件 Monitoring插件(monitoring)使用JavaMelody,对Jenkins进行监控.插件 ...
- Apache log4j2-RCE 漏洞复现(CVE-2021-44228)
Apache log4j2-RCE 漏洞复现 0x01 漏洞简介 Apache Log4j2是一个基于Java的日志记录工具.由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶 ...
- [源码解析] PyTorch 分布式(16) --- 使用异步执行实现批处理 RPC
[源码解析] PyTorch 分布式(16) --- 使用异步执行实现批处理 RPC 目录 [源码解析] PyTorch 分布式(16) --- 使用异步执行实现批处理 RPC 0x00 摘要 0x0 ...
- Docker从入门到精通(五)——Dockerfile
Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理. 1. ...
- IDEA 2021.2.1 破解版下载_激活安装图文教程(永久激活,亲测有效)
1.IntelliJ IDEA 2021 链接:https://pan.baidu.com/s/1Pwz3GrrkJdDZzg-wg5UjMw 提取码:56o6 无限重置 30 天试用期补丁 链接:h ...