• 2024蓝桥杯每日一题(BFS)


    备战2024年蓝桥杯 -- 每日一题
    Python大学A组

            试题一:母亲的奶牛
            试题二:走迷宫
            试题三:八数码1
            试题四:全球变暖
            试题五:八数码2


    试题一:母亲的奶牛

    【题目描述】

            农夫约翰有三个容量分别为 A,B,C 升的挤奶桶。最开始桶 A 和桶 B 都是空的,而桶 C 里装满了牛奶。有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。请你编写一个程序判断,当 A 桶是空的时候,C桶中可能包含多少升牛奶,找出所有的可能情况。

    【输入格式】

            共一行,包含三个整数 A,B,C。

    【输出格式】

            共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。

    【数据范围】

            1≤A,B,C≤20

    【输入样例】

    8 9 10

    【输出样例】

    1 2 8 9 10

     【解题思路】

            BFS简答模拟一下倒牛奶的过程。

    【Python程序代码】

    1. from collections import *
    2. a,b,c = map(int,input().split())
    3. n = 22
    4. st = [[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)]
    5. q = deque()
    6. def ins(a_,b_,c_):
    7. global q
    8. if st[a_][b_][c_]:return
    9. q.append([a_,b_,c_])
    10. st[a_][b_][c_]=1
    11. def bfs():
    12. q.append([0,0,c])
    13. st[0][0][c]=1
    14. while q:
    15. a_,b_,c_ = q.popleft()
    16. ins( a_-min(a_,b-b_) , b_+min(a_,b-b_) , c_ )
    17. ins( a_-min(a_,c-c_) , b_ , c_+min(a_,c-c_) )
    18. ins( a_+min(b_,a-a_) , b_-min(b_,a-a_) , c_ )
    19. ins( a_ , b_-min(b_,c-c_) , c_+min(b_,c-c_) )
    20. ins( a_+min(c_,a-a_) , b_ , c_-min(c_,a-a_) )
    21. ins( a_ , b_+min(c_,b-b_) , c_-min(c_,b-b_) )
    22. bfs()
    23. for c_ in range(c+1):
    24. for b_ in range(b+1):
    25. if st[0][b_][c_]:
    26. print(c_,end=' ')
    27. break

     试题二:走迷宫

    【题目描述】

            给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。

    【输入格式】

            第一行包含两个整数 n 和 m。

            接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

    【输出格式】

            输出一个整数,表示从左上角移动至右下角的最少移动次数。

    【数据范围】

            1≤n,m≤100

    【输入样例】

    1. 5 5
    2. 0 1 0 0 0
    3. 0 1 0 1 0
    4. 0 0 0 0 0
    5. 0 1 1 1 0
    6. 0 0 0 1 0

    【输出样例】

    8

     【解题思路】

            BFS的典中典。

    【Python程序代码】

    1. from collections import *
    2. n,m = map(int,input().split())
    3. mp = [[0]*(m+5)]
    4. for i in range(n):
    5. mp.append([0]+list(map(int,input().split())))
    6. dir = [(1,0),(-1,0),(0,1),(0,-1)]
    7. st = [[0]*(m+5) for _ in range(n+5)]
    8. def bfs():
    9. q = deque()
    10. q.append([1,1,0])
    11. st[1][1]=1
    12. while q:
    13. tx,ty,step = q.popleft()
    14. if tx==n and ty==m:
    15. print(step)
    16. return
    17. for x_,y_ in dir:
    18. nx,ny = tx+x_,ty+y_
    19. if nx<1 or nx>n or ny<1 or ny>m:continue
    20. if mp[nx][ny]==1 or st[nx][ny]:continue
    21. q.append( [nx,ny,step+1] )
    22. st[nx][ny]=1
    23. bfs()

     试题三:八数码

    【题目描述】

            在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。

    例如:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

            在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

    1. 1 2 3
    2. 4 5 6
    3. 7 8 x

            例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下

    1. 1 2 3 1 2 3 1 2 3 1 2 3
    2. x 4 6 4 x 6 4 5 6 4 5 6
    3. 7 5 8 7 5 8 7 x 8 7 8 x

             把 x 与上下左右方向数字交换的行动记录为 udlr。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。

    【输入格式】

            输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

            则输入为:1 2 3 x 4 6 7 5 8

    【输出格式】

            输出占一行,包含一个整数,表示最少交换次数。

            如果不存在解决方案,则输出 −1。

    【输入样例】

    2 3 4 1 5 x 7 6 8

    【输出样例】

    19

    【解题思路】

            简答题,用BFS遍历查找即可。

    【Python程序代码】

    1. from collections import *
    2. pd = ['0','1','2','3','4','5','6','7','8','x']
    3. norm = "".join(pd)
    4. dir = [1,-1,3,-3]
    5. s = ['0'] + list(map(str,input().split()))
    6. idx = s.index('x')
    7. mp = defaultdict(int)
    8. def bfs():
    9. q = deque()
    10. step = 0
    11. q.append( [s,idx,step] )
    12. ns = "".join(s)
    13. mp[ns]=1
    14. flag,res = 0,-1
    15. while q:
    16. ss,sidx,step = q.popleft()
    17. if "".join(ss)==norm:
    18. res = step
    19. break
    20. for i in dir:
    21. teps = ss.copy()
    22. nidx = sidx + i
    23. if nidx<1 or nidx>9:continue
    24. if (sidx==3 or sidx==6) and i==1:continue
    25. if (sidx==4 or sidx==7) and i==-1:continue
    26. teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
    27. nteps = "".join(teps)
    28. if mp[nteps]:continue
    29. mp[nteps]=1
    30. q.append( [teps,nidx,step+1] )
    31. print(res)
    32. bfs()

    试题四:全球变暖

    【题目描述】

            你有一张某海域 N×N像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

    1. .......
    2. .##....
    3. .##....
    4. ....##.
    5. ..####.
    6. ...###.
    7. .......

            其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 22 座岛屿。由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。例如上图中的海域未来会变成如下样子:

    1. .......
    2. .......
    3. .......
    4. .......
    5. ....#..
    6. .......
    7. .......

            请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

    【输入格式】

            第一行包含一个整数N。

            以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。

            照片保证第 1行、第 1 列、第 N 行、第 N 列的像素都是海洋。

    【输出格式】

            一个整数表示答案。

    【数据范围】

            1≤N≤1000

    【输入样例】

    1. 7
    2. .......
    3. .##....
    4. .##....
    5. ....##.
    6. ..####.
    7. ...###.
    8. .......

    【输出样例】

    1

    【解题思路】

            简答题,用BFS找一遍就可以。

    【Python程序代码】

    1. from collections import *
    2. n = int(input())
    3. mp,res = [],0
    4. st = [[0]*(n+5) for _ in range(n+5)]
    5. for i in range(n):
    6. mp.append(list(input()))
    7. def bfs(x,y):
    8. global res
    9. q = deque()
    10. flag = 0
    11. q.append([x,y])
    12. st[x][y]=1
    13. while q:
    14. tx,ty = q.popleft()
    15. for a,b in [[1,0],[-1,0],[0,1],[0,-1]]:
    16. nx,ny = tx+a,ty+b
    17. if nx<0 or nx>=n or ny<0 or ny>=n:continue
    18. if mp[nx][ny]=='.' or st[nx][ny]:continue
    19. st[nx][ny]=1
    20. if mp[nx+1][ny]==mp[nx-1][ny]==mp[nx][ny+1]==mp[nx][ny-1]=='#':flag=1
    21. q.append([nx,ny])
    22. if flag:res+=1
    23. cnt = 0
    24. for i in range(n):
    25. for j in range(n):
    26. if mp[i][j]=='#' and st[i][j]==0:
    27. cnt +=1
    28. bfs(i,j)
    29. print(cnt-res)

    试题五:八数码2

    【题目描述】

            在一个 3×3 的网格中,1∼8这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。

    例如:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

            在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

    1. 1 2 3
    2. 4 5 6
    3. 7 8 x

            例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下

    1. 1 2 3 1 2 3 1 2 3 1 2 3
    2. x 4 6 4 x 6 4 5 6 4 5 6
    3. 7 5 8 7 5 8 7 x 8 7 8 x

             把 x 与上下左右方向数字交换的行动记录为 udlr。现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。

    【输入格式】

            输入占一行,将 3×3 的初始网格描绘出来。例如,如果初始网格如下所示:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

            则输入为:1 2 3 x 4 6 7 5 8

    【输出格式】

           输出占一行,包含一个字符串,表示得到正确排列的完整行动记录。

            如果答案不唯一,输出任意一种合法方案即可。

            如果不存在解决方案,则输出 unsolvable

    【输入样例】

    2 3 4 1 5 x 7 6 8

    【输出样例】

    ullddrurdllurdruldr

    【解题思路】

            简答题,在前面八数码1的基础上改一下step就可以了。

    【Python程序代码】

    1. from collections import *
    2. pd = ['0','1','2','3','4','5','6','7','8','x']
    3. norm = "".join(pd)
    4. dir = [1,-1,3,-3]
    5. fx = ['r','l','d','u']
    6. s = ['0'] + list(map(str,input().split()))
    7. idx = s.index('x')
    8. mp = defaultdict(int)
    9. def bfs():
    10. q = deque()
    11. step = ""
    12. q.append( [s,idx,step] )
    13. ns = "".join(s)
    14. mp[ns]=1
    15. flag,res = 0,-1
    16. while q:
    17. ss,sidx,step = q.popleft()
    18. if "".join(ss)==norm:
    19. flag = 1
    20. res = step
    21. break
    22. for i in range(4):
    23. teps = ss.copy()
    24. nidx = sidx + dir[i]
    25. if nidx<1 or nidx>9:continue
    26. if (sidx==3 or sidx==6) and dir[i]==1:continue
    27. if (sidx==4 or sidx==7) and dir[i]==-1:continue
    28. teps[sidx],teps[nidx] = teps[nidx], teps[sidx]
    29. nteps = "".join(teps)
    30. if mp[nteps]:continue
    31. mp[nteps]=1
    32. q.append( [teps,nidx,step+fx[i]] )
    33. if flag:print(res)
    34. else:print('unsolvable')
    35. bfs()

  • 相关阅读:
    最新版 Cesium(1.99.0) 构建封装开发环境以及遇到问题
    20231012-黑马Vue学习笔记-第一天
    一种基于共识机制的数字集群终端防失控方案研究
    重要标准,关乎OCS和GOTS,12月1日开始执行
    linux常见指令
    JavaScript数据结构与算法-排序全详解
    已解决fatal error: Python.h: No such file or directory
    使用go语言开发自动化API测试工具
    Kotlin中特性、数据类、伴生对象、顶层函数
    《闲着刷题》(1)--牛客python入门题
  • 原文地址:https://blog.csdn.net/w2563216521/article/details/136809283