一本通 1262 挖地雷(基础DP 与 城市交通路网思路类似 不过值在点上)

1262:【例9.6】挖地雷

【题目描述】
在一个地图上有nn个地窖(n≤200n≤200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任意一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。

【输入】
第一行:地窖的个数;
第二行:为依次每个地窖地雷的个数;
下面若干行:
xiyi //表示从xi可到yi,xi<yi。
最后一行为"0000"表示结束。
【输出】
k1−k2−…−kvk1−k2−…−kv //挖地雷的顺序
挖到最多的雷。
【输入样例】
6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0
【输出样例】
3-4-5-6
34

思路:
与城市交通路网类似,不过需要自己来设计二维数组。
各列号作为终点,各行号作为起点。
注意:
1、题目中所说的“规定路径都是单向的,且保证都是小序号地窖指向大序号地窖”也就是说,在确定这个点的最大值的时候需要借助的各种能够到达的路径的小序号的点一定是可以确定值的。
2、不同的是初始化,本道题的各个路径的起点不一定相同,而且值是在点上,不再是在路径上,所以如果没有前驱的话(也就是它是一个起点)初始值应该是这个点的值。
3、本道题中,a数组记录各个点的原本地雷值,b数组描绘邻接矩阵的二维数组,c数组记录前驱,d数组记录到达每个重点的最优值(一条路径中所遇到的最大的地雷数)

具体思路可以参数博客城市交通路网https://blog.csdn.net/qq_40575034/article/details/103458380,已经在里面将那道题的思路集体讲述了,除上述问题需要注意之外,思路与之相同。

代码:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
/*并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,
也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径*/ 
//思路:类型城市交通网 只不过需要将二维数组自己设计出来 且起点可能有多个,终点需要自己找 

int a[201];//记录地窖中地雷的个数 
int b[201][201];//二维数组记录图 行号是各个起点 列号是终点 
int d[201];//记录到这个终点的能够经过地雷的最大值 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个 Python 编写的扫雷游戏代码,代码将会有注释说明每个函数的作用。 ``` import random def create_board(num_rows, num_cols, num_bombs): """ 创建扫雷游戏棋盘 num_rows:行数 num_cols:列数 num_bombs:地雷数量 """ board = [[0 for _ in range(num_cols)] for _ in range(num_rows)] # 初始化棋盘 bombs_planted = 0 while bombs_planted < num_bombs: row = random.randint(0, num_rows - 1) col = random.randint(0, num_cols - 1) if board[row][col] == '*': # 如果该位置已经有地雷,则重新生成随机坐标 continue board[row][col] = '*' # 在该位置放置地雷 bombs_planted += 1 assign_values(board) # 为每个地雷格子分配数字 return board def assign_values(board): """ 为每个地雷格子分配数字 """ for r in range(len(board)): for c in range(len(board[0])): if board[r][c] == '*': # 如果当前格子是地雷,跳过 continue # 计算当前格子周围的地雷数量 num_bombs = 0 if r > 0 and c > 0 and board[r-1][c-1] == '*': num_bombs += 1 if r > 0 and board[r-1][c] == '*': num_bombs += 1 if r > 0 and c < len(board[0]) - 1 and board[r-1][c+1] == '*': num_bombs += 1 if c > 0 and board[r][c-1] == '*': num_bombs += 1 if c < len(board[0]) - 1 and board[r][c+1] == '*': num_bombs += 1 if r < len(board) - 1 and c > 0 and board[r+1][c-1] == '*': num_bombs += 1 if r < len(board) - 1 and board[r+1][c] == '*': num_bombs += 1 if r < len(board) - 1 and c < len(board[0]) - 1 and board[r+1][c+1] == '*': num_bombs += 1 board[r][c] = num_bombs # 将当前格子的数字为周围地雷数量 def reveal_board(board, r, c, visited): """ 递归展示棋盘,即使得除了地雷格子外,所有的空白格子都会被展示 """ # 判断当前格子坐标是否越界或者当前格子已经被展示 if r < 0 or c < 0 or r >= len(board) or c >= len(board[0]) or visited[r][c]: return visited[r][c] = True # 标记当前格子已经展示 if board[r][c] > 0: # 如果当前格子不是空白格子,则只展示当前格子 return # 如果当前格子是空白格子,则展示当前格子,并递归展示其周围的所有空白格子 reveal_board(board, r-1, c, visited) reveal_board(board, r+1, c, visited) reveal_board(board, r, c-1, visited) reveal_board(board, r, c+1, visited) reveal_board(board, r-1, c-1, visited) reveal_board(board, r-1, c+1, visited) reveal_board(board, r+1, c-1, visited) reveal_board(board, r+1, c+1, visited) return def play_game(board): """ 主要游戏逻辑代码 """ num_rows = len(board) num_cols = len(board[0]) num_moves = num_rows * num_cols - num_bombs visited = [[False for _ in range(num_cols)] for _ in range(num_rows)] # 初始化标记列表,用于标记哪些格子已经被展示 while num_moves > 0: print("当前棋盘状态:") for row in board: print(row) print("\n") row_guess = int(input("请输入所猜测的行数(从1开始计数):")) col_guess = int(input("请输入所猜测的列数(从1开始计数):")) row_guess -= 1 col_guess -= 1 if visited[row_guess][col_guess]: # 如果该格子已经被展示过了 print("该格子已经被展示过了,请重新选择!\n") continue visited[row_guess][col_guess] = True # 标记该格子已被展示 if board[row_guess][col_guess] == "*": # 如果猜测到的格子是地雷 print("很抱歉,您猜错了!游戏结束!") return reveal_board(board, row_guess, col_guess, visited) # 根据递归函数展示当前棋盘 num_moves -= 1 print("恭喜您,您已经找出了所有的地雷,游戏胜利!") # 游戏参数配置 num_rows = 10 num_cols = 10 num_bombs = 10 board = create_board(num_rows, num_cols, num_bombs) play_game(board) ``` 以上就是扫雷游戏的 Python 实现代码,希望能够帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值