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 ...
随机推荐
- OSGi系列 - 使用Eclipse查看Bundle源码
使用Eclipse开发OSGi Bundle时,会发现有很多现成的Bundle可以用.但如何使用这些Bundle呢?除了上网搜索查资料外,阅读这些Bundle的源码也是一个很好的方法. 本文以org. ...
- MyEclipse配置Spring框架(基础篇)
一.新建项目,添加spring的相关jar包等 二.创建相关类以及属性和方法 Student.java package com.yh; public class Student implements ...
- maven依赖对zookeeper的版本冲突问题
我用的是springcloudAlibaba+zookeeper zookeeper下载后 1,修改配置文件,conf目录下的zoo_sample.cfg修改为zoo.cfg. 2,打开zoo.cfg ...
- 【C/C++】编码(腾讯)
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ba, ...
- 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用? 随着现在后端编程标 ...
- Sentry 开发者贡献指南 - 前端(ReactJS生态)
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- [BUUCTF]PWN——jarvisoj_level3_x64
jarvisoj_level3_x64 附件 步骤: 例行检查,64位程序,开启了nx保护 试运行一下程序,看看大概的情况 64位ida载入,习惯性的检索字符串,没有发现可以直接利用的system,估 ...
- CF667A Pouring Rain 题解
Content 一个水桶直径为 \(d\) 厘米,初始时水面高度为 \(h\) 厘米.你每秒钟喝 \(v\) 毫升水,而由于下雨,水桶里面的水在不喝水的时候每秒会上升 \(e\) 厘米.求你最少需要多 ...
- AT2202 硬度フェスティバル / Kode Festival 题解
Content 有 \(2^n\) 块石头,第 \(i\) 块石头硬度为 \(a_i\).重复执行以下操作直到只剩下一块石头为止: 让当前编号为 \((1,2)\).\((3,4)\).-- 的石头互 ...
- SpringCloud (一) Eureka
Eureka Eureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心. Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移 ...