题目

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的更多相关文章

  1. AtCoder Beginner Contest 170

    比赛链接:https://atcoder.jp/contests/abc170 A - Five Variables 题意 $5$ 个数中有 $1$ 个 $0$,判断是第几个. 代码 #include ...

  2. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

    题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 390  Solved: 109[ ...

  3. 1632: [Usaco2007 Feb]Lilypad Pond

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 404  Solved: 118[Sub ...

  4. bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond

    P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽 ...

  5. [USACO07FEB] Lilypad Pond

    https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...

  6. 最短路【洛谷P1606】 [USACO07FEB]荷叶塘Lilypad Pond

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令 ...

  7. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  8. P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  9. 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 ...

随机推荐

  1. redis入门到精通系列(六):redis的事务详解

    (一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...

  2. 【Service】【Database】【MySQL】基础

    1. 概念 1.1. 作者:Unireg 1.2. MySQL AB --> MySQL Solaris:二进制版本: 1.3. 官方网站: MySQL: www.mysql.com Maria ...

  3. scrapy爬取招聘网站,items转换成dict遇到的问题

    pipelines代码 1 import json 2 3 class TencentJsonPipeline(object): 4 def __init__(self): 5 self.file = ...

  4. 【kafka学习笔记】合理安排broker、partition、consumer数量

    broker的数量最好大于等于partition数量 一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势. broker如果免得是多个partition,需要随机分发,顺序IO会退 ...

  5. Jenkins代码检查

    目录 一.静态代码分析 二.规范检查 PMD进行检查 分析器区别 三.持续代码质量检测 Maven与SonarQube集成 Jenkins与SonarQube集成 代码扫描 SonarQube集成p3 ...

  6. Spring Cloud Alibaba微服务架构入门最容易理解篇

    微服务架构介绍 Spring Cloud Alibaba推荐的微服务生态架构基于分层架构实现如下: 接入层:最外层为LVS+Keepalived,可承受几十万级高并发流量洪峰,然后再通过内层的ngin ...

  7. png crc讲解

    我太难了. 我真的是为你们着想,你们学姐说misc太简单了,可就是这么简单我相信你们也不会做...我还得给你们讲解... 加油吧!!! 工具:010editor    这个我想给你放下载链接来着,后来 ...

  8. cmcc_simplerop

    这是一道系统调用+rop的题. 先来就检查一下保护. 32位程序,只开启了堆栈不可执行.ida看一下伪代码. 代码也很简洁,就是直接让你溢出.这里ida反汇编显示的v4具体ebp的距离是0x14,再加 ...

  9. mysql联合索引阻碍修改列数据类型:BLOB/TEXT column 'name' used in key specification without a key length

    今天在项目中mysql表中有一个字段数据类型为varchar,长度不够需要换为text类型 当时表是已经存在的表, CREATE TABLE `table_aaa` ( `id` int NOT NU ...

  10. 替换资源(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 还是那个熟悉的某吃货甲,一天之内给他分配了9.6个工时的吃量,这太不厚道了哈,人家一个人又要开吃又要喝汤,这怎么吃得消呢? ...