关于bfs的刷题

目录

1.Acwing 武士风度的牛  188(跟迷宫类似)

2.全球变暖(2018省赛)

3.跳蚱蜢  (2017年省赛)


1.Acwing 武士风度的牛  188(跟迷宫类似)

1.先建图

2.找出起点和终点

3.开始dfs()

4.用优先队列,把起点装入队列

a.弹出队列中的第一个,走下一步bfs,先判断是不是终点

b.判断出界,continue;判断标记;continue;判断障碍;continue

c.步数+1

d.打入队列,打标记

import sys
from queue import *
n,m=map(int,input().split())
b=[]
for i in range(m):
     a=list(input())
     b.append(a)
for i in range(m):
     for j in range(n):
          if b[i][j]=='K':
               x,y=i,j
          if b[i][j]=='H':
               e,d=i,j
vis=[[0 for i in range(n)]for j in range(m)]
dir=[[2,1],[-2,1],[2,-1],[-2,-1],[-1,2],[1,2],[-1,-2],[1,-2]]
q=Queue()
def bfs():
     q.put((x,y,0))
     vis[x][y]=1
     while not q.empty():
          now=q.get()
          if now[0]==e and now[1]==d:
               print(now[2])
               sys.exit()
          for i in range(8):
               next_x=now[0]+dir[i][0]
               next_y=now[1]+dir[i][1]
               if next_x<0 or next_y<0 or next_x>=m or next_y>=n:
                    continue
               if vis[next_x][next_y]==1:
                    continue
               if b[next_x][next_y]=='*':
                    continue
               next_path=now[2]+1
               q.put((next_x,next_y,next_path))
               vis[next_x][next_y]=1
print(bfs())

2.全球变暖(2018省赛)

题目描述

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

.......

.##....

.##....

....##.

..####.

...###.

.......

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......

.......

.......

.......

....#..

.......

.......

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

输入描述

第一行包含一个整数 N (1≤N≤1000)。

以下 N 行 N 列代表一张海域照片。

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

输出描述

输出一个整数表示答案。

样例输入

7
.......
.##....
.##....
....##.
..####.
...###.
.......

样例输出

1 

1.用bfs

先找到一块陆地,然后判断他是不是高地,如果不是,在判断周围的陆地是不是高地,判断完要打上标记,如果是,就把flag改为1,继续把周围的陆地打上标记

2.最后遍历,条件是没打过标记和是陆地的,加上所有flag为0的

from queue import *
vis=[[0 for i in range(1005)]for j in range(1005)]
n=int(input())
b=[]
for i in range(n):
    b.append(list(input()))
def bfs(x,y):
    dir=[(0,1),(0,-1),(1,0),(-1,0)]
    q=Queue()
    q.put((x,y))
    flag=0
    while not q.empty():
        now=q.get()
        now_x=now[0]
        now_y=now[1]
        if flag==0:
            if b[now_x+1][now_y]=='#' and b[now_x-1][now_y]=="#" and b[now_x][now_y+1]=="#" and b[now_x][now_y-1]=="#":
                flag=1
        for i in range(4):
            next_x=now_x+dir[i][0]
            next_y=now_y+dir[i][1]
            if vis[next_x][next_y]==0 and b[next_x][next_y]=="#":
                q.put((next_x,next_y))
                vis[next_x][next_y]=1
    if flag==1:
        return False
    if flag==0:
        return True
ans=0
for i in range(n):
    for j in range(n):
        if b[i][j]=='#' and vis[i][j]==0:
            if dfs(i,j):
                ans+=1
print(ans)

3.跳蚱蜢  2017年省赛

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下图所示: 有 9 只盘子,排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1 ~ 8。

每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。

请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列, 并且保持空盘的位置不变(也就是 1-8换位,2−7换位,...),至少要经过多少次跳跃? 

1.用bfs,先确定起始形态和终止形态,

2.先把起始形态放入队列中,然后取出第一个,让他顺时针走一个,两个;逆时针走一个,两个;

然后记住步数,别忘了最后要把交换的位置返回

3.把放入过队列的,打上标记,重复上述操作

4. 找到终点最后输出步数

from math import *
from queue import *
mp={}
a1='012345678'
a2='087654321'
q=Queue()
q.put((a1,0))
mp[a1]=1
while not q.empty():
  now=q.get()
  x=now[0]
  if x==a2:
    print(now[1])
    break
  t=list(x)
  j=t.index('0')
  for i in range(-2,3):
    i0=divmod(i+j+9,9)[1]
    t[j],t[i0]=t[i0],t[j]
    y="".join(t)
    if y not in mp:
      mp[y]=1
      w=now[1]+1
      q.put((y,w))
    t[j],t[i0]=t[i0],t[j]
   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值