2022-04-16:在一个10^6 * 10^6的网格中,
source = [sx, sy]是出发位置,target = [tx, ty]是目标位置,
数组blocked是封锁的方格列表,被禁止的方格数量不超过200,
blocked[i] = [xi, yi] 表示(xi, yi)的方格是禁止通行的,
每次移动都可以走上、下、左、右四个方向,
但是来到的位置不能在封锁列表blocked上,
同时不允许走出网格。
如果从source能到达target返回 true。否则返回false。

答案2022-04-16:

宽度优先遍历。
n个×,围住n*(n-1)/2个格子。

代码用rust编写。代码如下:

use std::collections::HashSet;

fn main() {
let blocked: Vec<Vec<isize>> = vec![vec![0, 1], vec![1, 0]];
let source: Vec<isize> = vec![0, 0];
let target: Vec<isize> = vec![0, 2];
let ret: bool = isEscapePossible(blocked, source, target);
println!("{}", ret);
} const offset: isize = 1000000; fn isEscapePossible(blocked: Vec<Vec<isize>>, source: Vec<isize>, target: Vec<isize>) -> bool {
let n = blocked.len();
let maxPoints: isize = (n * (n - 1) / 2) as isize;
let mut blockSet: HashSet<isize> = vec![].into_iter().collect();
for i in 0..n {
blockSet.insert(blocked[i][0] * offset + blocked[i][1]);
}
return bfs(
source[0], source[1], target[0], target[1], maxPoints, &blockSet,
) && bfs(
target[0], target[1], source[0], source[1], maxPoints, &blockSet,
);
} fn bfs(
fromX: isize,
fromY: isize,
toX: isize,
toY: isize,
maxPoints: isize,
blockSet: &HashSet<isize>,
) -> bool {
let mut visited: HashSet<isize> = vec![].into_iter().collect();
let mut queue: Vec<isize> = Vec::new();
visited.insert(fromX * offset + fromY);
queue.push(fromX * offset + fromY);
while queue.len() > 0 && (visited.len() as isize <= maxPoints) {
let cur = queue[0];
queue.remove(0);
let curX = cur / offset;
let curY = cur - curX * offset;
if (findAndAdd(curX - 1, curY, toX, toY, blockSet, &mut visited, &mut queue)
|| findAndAdd(curX + 1, curY, toX, toY, blockSet, &mut visited, &mut queue)
|| findAndAdd(curX, curY - 1, toX, toY, blockSet, &mut visited, &mut queue)
|| findAndAdd(curX, curY + 1, toX, toY, blockSet, &mut visited, &mut queue))
{
return true;
}
}
return visited.len() as isize > maxPoints;
} // 来到的点,(row, col)
// 要寻找的目标点,toX, toY
// HashSet<Long> blockSet存着不能走的格子!障碍点!
// HashSet<Long> visited, Queue<Long> queue 为了宽度优先遍历服务的!
// visited,已经处理过的点,请不要重复的放入queue
// 如果已经到达了(toX, toY)
fn findAndAdd(
row: isize,
col: isize,
toX: isize,
toY: isize,
blockSet: &HashSet<isize>,
visited: &mut HashSet<isize>,
queue: &mut Vec<isize>,
) -> bool {
if (row < 0 || row == offset || col < 0 || col == offset) {
return false;
}
if (row == toX && col == toY) {
return true;
}
let value = row * offset + col;
if !blockSet.contains(&value) && !visited.contains(&value) {
visited.insert(value);
queue.push(value);
}
return false;
}

执行结果如下:


左神java代码

2022-04-16:在一个10^6 * 10^6的网格中, source = [sx, sy]是出发位置,target = [tx, ty]是目标位置, 数组blocked是封锁的方格列表,被禁止的的更多相关文章

  1. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

  2. Ubuntu网络配置IP和DNS等,适用于14.04,16.04和17.10

    本文主要介绍Ubuntu系统的网络设置,包括IP,DNS和主机名等,适用于14.04,16.04和17.10等版本 ===============  完美的分割线 ================ = ...

  3. Ubuntu 16.04/16.10安装 KDE Plasma

    KDE目前的最新版本是Plasma 5.7(2016-10).Ubuntu默认的桌面环境是Unity,下面记录怎么在Ubuntu 16.04/16.10上安装KDE. Ubuntu 16.04/16. ...

  4. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之实例类型-10 欢迎加QQ群:1026880196 进行交流学习 实例类型 #controller1 ...

  5. SQLSERVER 16进制与10进制转换

    最近工控项目中遇到的16进制与10进制转换,在.NET中比较容易实现,在SQLSERVER中发现没有直接的转换,尤其是出现超出范围的long负数,即无符号64位整数在sqlserver中的存储.网上找 ...

  6. delphi 中字符串与16进制、10进制转换函数

      //字符串转成16进制代码function strToHexStr(str:string):string;varc:char;ss:string;i:integer;beginwhile str& ...

  7. 对<< ubuntu 12.04编译安装linux-3.6.10内核笔记>>的修正

    前题: 在前几个月的时候,写了一篇笔记,说的是kernel compile的事情,当时经验不足,虽说编译过了,但有些地方写的有错误--因为当时的理解是有错误的.今天一一更正,记录如下: 前文笔记链接: ...

  8. java中16进制转换10进制

    java中16进制转换10进制 public static void main(String[] args) { String str = "04e1"; String myStr ...

  9. 16进制转10进制 HDU-1720

    A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. Ubuntu 14.04 16.04 Linux nvidia 驱动下载与安装

    Ubuntu 14.04 16.04 nvidia 驱动安装 最简单直观的方式是在如下的对话框中直接选择驱动安装即可 但是有时候,驱动不够新,比如14.04用的是340.98版本,如果手动安装驱动可以 ...

随机推荐

  1. adb命令2

    1.获取手机型号指令 adb shell cat /system/build.prop | findstr "ro.product.model" 2.获取手机处理器信息 adb s ...

  2. Python项目案例开发从入门到实战 - 书籍信息

    Python项目案例开发从入门到实战 - 爬虫.游戏和机器学习(微课版) 作者:郑秋生 夏敏捷 清华大学出版社 ISBN:978-7-302-45970-5

  3. 文本的格式化标签(粗体,斜体)和 <div>和<span>标签(都是双标签)

    上一个笔记有提到各种型号的标题,为了保证文章的美观,又会有除了标题之外的东西,比如粗体,斜体,下划线,删除线和各种分隔 1加粗,<strong><strong/>或者<b ...

  4. 什么是5G垂直行业?

    什么是垂直行业呢? 感觉"垂直行业"这个词在太多地方遇到,但是这个词的涵盖范围到底是什么呢? 垂直这一概念源于两条直线(或平面)的直角交叉,两条直线是相互作为参照物的.比如,我们可 ...

  5. windows 安装mysql57

    1. 配置my.ini文件 在根目录下新建 "my.ini" 文件: 添加配置: [mysql] # 设置mysql客户端默认字符集 default-character-set=u ...

  6. Python学习笔记--循环的知识以及应用

    while循环 代码: 结果: 案例:求1-100的和 实现: 案例:while循环猜数字 实现: while循环的嵌套使用 案例:打印九九乘法表 (注意:要是想要输出不换行,代码可以这样写:prin ...

  7. mybatis-plus 开发环境在控制台打印日志

    参考博客:https://blog.csdn.net/qq_32929057/article/details/109291919 # 注意在生产环境注释掉 mubatis-plus: configur ...

  8. Agora Flat:在线教室的开源初体验

    开发者其实很多时候都非常向往开源,开源领域的大佬也特别多,我们谈不上有多资深,也是一边探索一边做.同时,也希望可以借这次机会把我们摸索到的一些经验分享给大家. 01 Flat 是什么 Flat 是一个 ...

  9. 屎上最全vue-pdf+Springboot与aspose-words整合,开箱即用

    前言 ⏲️本文阅读时长:约10分钟 主要目标: 1.实现Springboot与aspose-words整合,填充word模板并转化PDF; 2.前端vue整合vue-pdf实现PDF预览及下载 wor ...

  10. Django笔记十之values_list指定字段取值及distinct去重处理

    这篇笔记将介绍 reverse.distinct.values 和 values_list 的用法. 本篇笔记目录如下: reverse() values() values_list() distin ...