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编写。代码如下:

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代码