AT_abc295_b [ABC295B] Bombs 题解

引入 曼哈顿距离:两个点在标坐标系上的绝对轴距总和 即 | r1-r2 | + | c1-c2 |

题意:在输入中, # 代表围墙  · 代表空地  数字到点的曼哈顿距离小于这个数字都要被炸成空地

题目描述

縦 RR 行横 CC 列の盤面があります。上から ii 行目、左から jj 列目のマスを (i,j)(i,j) と表します。

(i,j)(i,j) の現在の状態が文字 B_{i,j}Bi,j​ として与えられます。 . は空きマス、# は壁があるマスを表し、 12,\dots…, 9 はそれぞれ威力 1,2,\dots,91,2,…,9 の爆弾があるマスを表します。

次の瞬間に、全ての爆弾が同時に爆発します。 爆弾が爆発すると、爆弾があるマスからのマンハッタン距離がその爆弾の威力以下であるような全てのマス(その爆弾があるマス自体を含む)が空きマスに変わります。 ここで、(r_1,c_1)(r1​,c1​) から (r_2,c_2)(r2​,c2​) までのマンハッタン距離は |r_1-r_2|+|c_1-c_2|∣r1​−r2​∣+∣c1​−c2​∣ です。

爆発後の盤面を出力してください。

题意翻译

在字符与数字的矩阵中,数字(C[i][j])代表炸弹的范围,其能炸到的范围内的点与数字之间的曼哈顿距离<=C[i][j],即| r1-r2 | + | c1-c2 | < = C [ i ] [ j ]

图示 其中 · 代表空地 # 代表墙壁 这里空地表示炸弹能炸到的范围

 输入输出样例

Input #1

4 4
.1.#
###.
.#2.
#.##

Output #1

...#
#...
....
#...

Input #2

2 5
..#.#
###.#

Output #2

..#.#
###.#

Input #3

2 3
11#
###

Output #3

...
..#

Input #4

4 6
#.#3#.
###.#.
##.###
#1..#.

Output #4

......
#.....
#....#
....#.

数据范围

1<=n,c=20(非常水,放心大胆暴力)

简约而不简单的暴力ac代码

#include<bits/stdc++.h>
using namespace std;
char C[25][25];
int r,c;
int main(){
	cin>>r>>c;
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			cin>>C[i][j];
        }
    }
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			if(C[i][j]>='1'&&C[i][j]<='9'){//如果该点为炸弹
				for(int k=1;k<=r;k++){
					for(int t=1;t<=c;t++){
						int x=C[i][j]-'0';//被炸成空地的点与数字之间曼哈顿距离最大值 强制转换
						if(abs(i-k)+abs(j-t)<=x&&C[k][t]=='#') C[k][t]='.';
                            //代码核心 横轴与纵轴的距离和 后半段条件为我们省略了本就是空地的赋                            
                              //值  也算小小优化
                    }
                }
			}
        }
    }
	for(int i=1;i<=r;i++){
		for(int j=1;j<=c;j++){
			if(C[i][j]>='1'&&C[i][j]<='9') cout<<'.';//炸弹位置本身变成空地
			else cout<<C[i][j];
        }
		cout<<endl;
	}
	return 0;//好习惯
}

当然还有更优的搜索解法,由于本蒟蒻太蒻,不多赘述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Python 扫雷游戏代码示例: ```python import random # 定义常量 BOMB = -1 HIDDEN = 0 UNCOVERED = 1 class Minesweeper: def __init__(self, rows, cols, bombs): self.rows = rows self.cols = cols self.bombs = bombs self.grid = [[HIDDEN] * cols for _ in range(rows)] self.generate_bombs() def generate_bombs(self): bombs_placed = 0 while bombs_placed < self.bombs: row = random.randint(0, self.rows - 1) col = random.randint(0, self.cols - 1) if self.grid[row][col] != BOMB: self.grid[row][col] = BOMB bombs_placed += 1 def uncover(self, row, col): if self.grid[row][col] == BOMB: return False elif self.grid[row][col] == HIDDEN: self.grid[row][col] = UNCOVERED if self.neighbor_bomb_count(row, col) == 0: for r in range(max(0, row - 1), min(row + 2, self.rows)): for c in range(max(0, col - 1), min(col + 2, self.cols)): if r != row or c != col: self.uncover(r, c) return True def neighbor_bomb_count(self, row, col): count = 0 for r in range(max(0, row - 1), min(row + 2, self.rows)): for c in range(max(0, col - 1), min(col + 2, self.cols)): if self.grid[r][c] == BOMB: count += 1 return count def __str__(self): result = '' for row in self.grid: for cell in row: if cell == UNCOVERED: count = self.neighbor_bomb_count(self.grid.index(row), row.index(cell)) result += str(count) if count > 0 else ' ' elif cell == HIDDEN: result += '*' else: result += 'X' result += '\n' return result[:-1] # 示例用法 game = Minesweeper(5, 5, 5) print(game) game.uncover(2, 2) print(game) ``` 该示例代码使用了一个 `Minesweeper` 类来表示扫雷游戏,并包含了以下方法: - `__init__(self, rows, cols, bombs)`:构造方法,初始化游戏的行数、列数和炸弹数,并生成游戏网格。 - `generate_bombs(self)`:随机生成指定数量的炸弹。 - `uncover(self, row, col)`:揭开指定位置的格子,并递归揭开周围的空格(如果有的话)。 - `neighbor_bomb_count(self, row, col)`:返回指定位置周围的炸弹数量。 - `__str__(self)`:将游戏网格转换为字符串,方便输出。 你可以根据自己的需求对这个示例代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值