题解 | #Shopee的办公室(二)#

Shopee的办公室(二)

http://www.nowcoder.com/questionTerminal/a71f3bd890734201986cd1e171807d30

使用了 dfs bfs 都不行,看答案,才发现需要使用动态规划。。。 太坑了
package main

import "fmt"

func main() {
	x, y := 0, 0
	n := 0
	fmt.Scan(&x, &y, &n)
	var dp [31][31]int // dp[i][j] 表示从0,0到i,j的所有路径数
	bossLocation := [][2]int{}    // 该数组用于bfs和dfs算法,dp算法可忽略
	bx := 0
	by := 0
	for i := 0; i < n; i++ {
		fmt.Scan(&bx, &by)
		bossLocation = append(bossLocation, [2]int{bx, by})
		dp[bx][by] = -1
	}

	for i := 0; i <= x; i++ {
		dp[i][0] = 1 // 很明显,从0,0 到 x,0的路径数均为1
	}
	for i := 0; i <= y; i++ {
		dp[0][i] = 1 // 很明显,从0,0 到 0,y的路径数均为1
	}

	for i := 1; i <= x; i++ {
		for j := 1; j <= y; j++ {
			if dp[i][j] == -1 {
				continue
			}
			if dp[i][j-1] != -1 {
				dp[i][j] += dp[i][j-1]
			}
			if dp[i-1][j] != -1 {
				dp[i][j] += dp[i-1][j]
			}
		}
	}
	fmt.Println(dp[x][y])

	//count := 0
	//dfs(0, 0, &count, bossLocation, x, y)
	//fmt.Println(count)
	//ret := bfs(bossLocation, x, y)
	//fmt.Println(ret)

}

func dfs(x, y int, count *int, bossLocation [][2]int, targetX, targetY int) {
	if x > targetX || y > targetY {
		return
	}
	if x == targetX && y == targetY {
		*count++
		return
	}
	if !isBossLocation(x+1, y, bossLocation) {
		dfs(x+1, y, count, bossLocation, targetX, targetY)
	}

	if !isBossLocation(x, y+1, bossLocation) {
		dfs(x, y+1, count, bossLocation, targetX, targetY)
	}

}

func isBossLocation(x, y int, bossLocation [][2]int) bool {
	for i := 0; i < len(bossLocation); i++ {
		if x == bossLocation[i][0] && y == bossLocation[i][1] {
			return true
		}
	}
	return false
}

func bfs(bossLocation [][2]int, x, y int) int {
	queue := [][2]int{}
	queue = append(queue, [2]int{0, 0}) // 初始坐标入库
	count := 0

	for len(queue) > 0 {
		front := queue[0]
		queue = queue[1:]
		if front[0] == x && front[1] == y {
			count++
		}
		if !isBossLocation(front[0]+1, front[1], bossLocation) && front[0]+1 <= x {
			queue = append(queue, [2]int{front[0] + 1, front[1]})
		}
		if !isBossLocation(front[0], front[1]+1, bossLocation) && front[1]+1 <= y {
			queue = append(queue, [2]int{front[0], front[1] + 1})
		}
	}
	return count
}


全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151650次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11203次浏览 101人参与
# 不去互联网可以去金融科技 #
20385次浏览 255人参与
# 和牛牛一起刷题打卡 #
18978次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203386次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# OPPO开奖 #
19201次浏览 267人参与
# 通信硬件薪资爆料 #
265913次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2223次浏览 34人参与
# 互联网公司评价 #
97687次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454868次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53903次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14644次浏览 349人参与
# 硬件人的简历怎么写 #
82286次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28097次浏览 248人参与
# 学历对求职的影响 #
161239次浏览 1804人参与
# 你收到了团子的OC了吗 #
538722次浏览 6386人参与
# 你已经投递多少份简历了 #
344226次浏览 4963人参与
# 实习生应该准时下班吗 #
96977次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63524次浏览 622人参与
牛客网
牛客企业服务