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

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-04-16:在一个10^6 * 10^6的网格中, source = [sx, sy]是出发位置,target = [tx, ty]是目标位置, 数组blocked是封锁的方格列表,被禁止的相关的知识,希望对你有一定的参考价值。

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是封锁的方格列表,被禁止的的主要内容,如果未能解决你的问题,请参考以下文章

小米6怎么刷安卓10固定包

设置:OS X 10.6.6 + XCode3.2 使用 python 和 cocoa

在 Visual Studio 10 中调试 VC++ 6 项目

在 Mac OS 10.6.8 上安装 XMLSec 时出错

如何在 C++ 中将 10 位映射到 6 位(尽可能高效)?

preferredContentSize更改窗口大小在osx 10.12.6中不起作用