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. P3128 [USACO15DEC]Max Flow P(树上倍增和树链剖分)

    思路1(树上倍增$ + $树上差分) 每次都修改一条从\(u\)到\(v\),不就是树上差分的专门操作吗?? 直接用倍增求\(LCA\),每次\(d[u]++,d[v]++,d[LCA(u,v)]-- ...

  2. eclipse console 控制台输出乱码解决办法

    一.console输出日志显示乱码 二.在类编辑处点击右键 Run As --> Run Configurations 三.在Common中设置字符集 gbk 四.restart 搜索 复制

  3. podman 入门实战

    一入编程深似海,从此节操是路人. 最近使用podman,就想着写一篇总结性的笔记,以备后续参考.就如同写代码,不写注释,过了一段时间可能会想这是我写的吗?不会吧,还要理一下逻辑才能读懂,不利于后期维护 ...

  4. ElasticSearch 实现分词全文检索 - delete-by-query

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  5. GPSSworld仿真(一):程序题——单窗口排队系统

    3.3 一个仓库共存放了2000吨货物,货物以三种规模出库,少量(10吨),中等(20吨),大量(50吨),分别以10±5分,15分,30±10分的速率出库.如果没有货位达到的情况下,一个仓库能维持供 ...

  6. 50个Java面试必问的面试题,我都给你整好了

    ​我们整理了一份主要的Angular面试问题清单,分为三部分: 角度面试问题–初学者水平 角度面试问题–中级 角度面试问题–高级 初学者水平–面试问题 1.区分Angular和AngularJS. 2 ...

  7. MyBatisPlus 整合 SpringBoot 遇见的问题(二)

    [异常]:Cause: java.sql.SQLSyntaxErrorException: Unknown column 'udf1' in 'field list'...... SQL: SELEC ...

  8. SpringBoot中常见的各种初始化场景分析

    大家能区分出以下各种初始化适用的场景吗 ApplicationRunner,CommandLineRunner,BeanFactoryPostProcessor,InitializingBean,Be ...

  9. cephadm 安装部署 ceph 集群

    介绍 手册: https://access.redhat.com/documentation/zh-cn/red_hat_ceph_storage/5/html/architecture_guide/ ...

  10. 在k8s上安装Harbor

    在k8s上安装Harbor 先前条件 <kubernetes(k8s) 存储动态挂载><在k8s(kubernetes)上安装 ingress V1.1.3> 参考我之前的文档 ...