解题思路:常规的DFS+剪枝:看到题目说求路径,第一反应就是深搜或者动态规划

注意事项:这个网站是可以ac的,但我在蓝桥杯提交了一下,发现第二个测试点居然是错误,我没开vip不知道为啥,都遍历全可能了还会错误???有知道的烦请@我一下

后续有两个测试点会超时
优化--不用额外数组存储行列经过次数,直接在原次数的基础上做减法,省去每次回溯复制数组的时间,剪枝条件改为<0就continue,.可能可以在官网ac?
参考代码:

# 暴力回溯+剪枝
def dfs(position, r_c, pas):
    global ans
    if position == (n - 1, n - 1):#到达右下角退出
        if r_c[0] == c_count and r_c[1] == r_count:
            ans = pas.copy() # 此处必须用copy,否则会返回0,我估计是python将pas回溯到了输入时的状态,赋值只赋值了一个引用
        return
    else:
        for each in directions:#遍历上左右的走法
            dx = position[0] + each[0]
            dy = position[1] + each[1]
            if 0 <= dx < n and 0 <= dy < n and not matrix[dx][dy]:
                r_c[0][dy] += 1 #将对应行和列的经过次数+1
                r_c[1][dx] += 1
                if r_c[0][dy] > c_count[dy] or r_c[1][dx] > r_count[dx]: # 若大于要求的次数就直接跳过,进行下一个方向
                    r_c[0][dy] -= 1
                    r_c[1][dx] -= 1
                    continue
                matrix[dx][dy] = 1 
                pas.append((dx, dy)) # 经过哪些坐标
                dfs((dx, dy), r_c, pas)
                r_c[0][dy] -= 1
                r_c[1][dx] -= 1
                matrix[dx][dy] = 0
                pas.pop()


n = int(input().strip())
c_count = list(map(int, input().strip().split()))
r_count = list(map(int, input().strip().split()))
ans = []
matrix = [[0 for _ in range(n)] for _ in range(n)]  # 是否走过坐标
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
r_c = [[0 for _ in range(n)] for _ in range(2)]  # 行和列的经过的次数
r_c[0][0] += 1 # 经过(0,0)
r_c[1][0] += 1
dfs((0, 0), r_c, [(0, 0)])
for each in ans:
    print(each[0] * n + each[1], end = " ")


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论