列表

详情


NC22232. 扫雷

描述

扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。

现在给出n行m列的雷区中的地雷分布,请计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。


输入描述

第一行输入两个整数n,m ,分别表示雷区的行数和列数。

接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

1<=n,m<=100

输出描述

输出包含n行,每行m个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符

示例1

输入:

3 3
*??
???
?*?

输出:

*10
221
1*1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 48ms, 内存消耗: 4668K, 提交时间: 2023-02-22 09:07:17

n, m = map(int, input().split())
mine_map = [list(input()) for _ in range(n)]
for i in range(n):
    for j in range(m):
        if mine_map[i][j] == '?':
            count = 0
            for x in range(max(i-1, 0), min(i+2, n)):
                for y in range(max(j-1, 0), min(j+2, m)):
                    if mine_map[x][y] == '*':
                        count += 1
            mine_map[i][j] = str(count)
for row in mine_map:
    print(''.join(row))

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 468K, 提交时间: 2019-05-29 10:27:35

#include<bits/stdc++.h>
using namespace std;
int a[105][105];
int main(){
	char l;
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>l;
			if(l=='*')a[i][j]=1;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			if(a[i][j]==1)cout<<"*";
			else cout<<a[i+1][j+1]+a[i][j+1]+a[i+1][j]+a[i-1][j-1]+a[i+1][j-1]+a[i-1][j+1]+a[i-1][j]+a[i][j-1];
			if(j==m)cout<<endl;
		}
	return 0;
}

C 解法, 执行用时: 4ms, 内存消耗: 384K, 提交时间: 2021-11-14 22:58:46

#include<stdio.h>
int main()
{
int n,m,i,j;
int d,o,k;
scanf("%d %d",&n,&m);
int a[100][100];
for(i=0;i<n;i++)
{
for(j=0;j<=m;j++)
{
scanf("%c",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<=m;j++)
{
if(a[i][j]=='*')
printf("%c",a[i][j]);
else if(a[i][j]=='?')
{
for(d=0,o=i-1;o<=i+1;o++)
{
for(k=j-1;k<=j+1;k++)
{if(a[o][k]=='*'&&(o!=i||k!=j))
d++;}
}
printf("%d",d);
}
}
printf("\n");
}
return 0;
}

上一题