前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3)

2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3)

原创
作者头像
福大大架构师每日一题
发布2022-11-24 23:10:45
4490
发布2022-11-24 23:10:45
举报

2022-11-24:小团在地图上放了3个定位装置,想依赖他们进行定位!

地图是一个n*n的棋盘,

有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在1,n内。

小团在(a,b)位置放了一个信标,

每个定位装置会告诉小团它到信标的曼哈顿距离,也就是对于每个点,小团知道|xi-a|+|yi-b|

求信标位置,信标不唯一,输出字典序最小的。

输入n,然后是3个定位装置坐标,

最后是3个定位装置到信标的曼哈顿记录。

输出最小字典序的信标位置。

1 <= 所有数据值 <= 50000。

来自美团。8.20笔试。题目2。

答案2022-11-24:

先找半径小的,小圆周要快些,宽度优先遍历。

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

代码语言:go
复制
package main

import (
	"fmt"
)

func main() {
	ans := find(3, []int{1, 1}, []int{3, 1}, []int{3, 4}, 3, 3, 2)
	fmt.Println(ans)
}

const MAX_VALUE = 1<<31 - 1

func find(n int, a, b, c []int, ad, bd, cd int) []int {
	var x1 []int
	r1 := MAX_VALUE
	var x2 []int
	r2 := 0
	var x3 []int
	r3 := 0
	if ad < r1 {
		x1 = a
		r1 = ad
		x2 = b
		r2 = bd
		x3 = c
		r3 = cd
	}
	if bd < r1 {
		x1 = b
		r1 = bd
		x2 = a
		r2 = ad
		x3 = c
		r3 = cd
	}
	if cd < r1 {
		x1 = c
		r1 = cd
		x2 = a
		r2 = ad
		x3 = b
		r3 = bd
	}
	// x1 r1     x2 r2 x3 r3
	cur := []int{x1[0] - r1, x1[1]}
	queue := make([][]int, 0)
	visited := make(map[string]struct{})
	ans := make([][]int, 0)
	queue = append(queue, cur)
	visited[fmt.Sprintf("%d_%d", cur[0], cur[1])] = struct{}{}

	for len(queue) > 0 {
		// cur x1为圆心,r1为半径的圆周上
		cur = queue[0]
		queue = queue[1:]
		if cur[0] >= 1 && cur[0] <= n && cur[1] >= 1 && cur[1] <= n && distance(cur[0], cur[1], x2) == r2 && distance(cur[0], cur[1], x3) == r3 {
			ans = append(ans, cur)
		}
		if len(ans) == 2 {
			break
		}
		add(cur[0]-1, cur[1]-1, x1, r1, &queue, visited)
		add(cur[0]-1, cur[1], x1, r1, &queue, visited)
		add(cur[0]-1, cur[1]+1, x1, r1, &queue, visited)
		add(cur[0], cur[1]-1, x1, r1, &queue, visited)
		add(cur[0], cur[1]+1, x1, r1, &queue, visited)
		add(cur[0]+1, cur[1]-1, x1, r1, &queue, visited)
		add(cur[0]+1, cur[1], x1, r1, &queue, visited)
		add(cur[0]+1, cur[1]+1, x1, r1, &queue, visited)
	}
	if len(ans) == 1 || ans[0][0] < ans[1][0] || (ans[0][0] == ans[1][0] && ans[0][1] < ans[1][1]) {
		return ans[0]
	} else {
		return ans[1]
	}
}

func add(x, y int, c []int, r int, queue *[][]int, visited map[string]struct{}) {
	key := fmt.Sprintf("%d_%d", x, y)
	_, ok := visited[key]
	if (distance(x, y, c) == r) && !ok {
		*queue = append(*queue, []int{x, y})
		visited[key] = struct{}{}
	}
}

func distance(x, y int, c []int) int {
	return abs(x-c[0]) + abs(y-c[1])
}

func abs(a int) int {
	if a < 0 {
		return -a
	} else {
		return a
	}
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档