列表

详情


NC52069. 扫雷

描述

sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵,他希望你帮他生成一个扫雷矩阵。

 

扫雷矩阵的每一行每一列都是一个数字,每个数字的含义是与当前位置相邻的8个方向中,有多少个雷(在下图中,雷用*表示);如果当前位置就是雷的话,仍输出一个*。

比如初始的雷矩阵如下:

....

..**

*.*.

.*.*
对应的数字矩阵为:

0122

13**

 *4*4

2*3* 





输入描述

第一行两个整数n,m,代表矩阵有n行m列

接下来共n行,每行m个字符

输出描述

输出共n行m列,为扫雷矩阵。

示例1

输入:

4 4
....
..**
*.*.
.*.*

输出:

0122
13**
*4*4
2*3*

示例2

输入:

3 4
....
*..*
.*.*

输出:

1111
*23*
2*3*

原站题解

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

Go 解法, 执行用时: 902ms, 内存消耗: 4208K, 提交时间: 2023-08-12 13:04:15

package main

import "fmt"

func main() {
	var n, m int
	fmt.Scan(&n, &m)
	src := make([][]byte, n)
	for i := range src {
		src[i] = make([]byte, m)
		var temp string
		fmt.Scan(&temp)
		for j := range src[i] {
			if temp[j] == '.' {
				src[i][j] = '0'
				continue
			}
			src[i][j] = temp[j]
		}
	}
	for i, v := range src {
		for j, k := range v {
			if k == '*' {
				if i-1 >= 0 && src[i-1][j] != '*' {
					src[i-1][j] += 1
				}
				if i+1 < n && src[i+1][j] != '*' {
					src[i+1][j] += 1
				}
				if j-1 >= 0 && src[i][j-1] != '*' {
					src[i][j-1] += 1
				}
				if j+1 < m && src[i][j+1] != '*' {
					src[i][j+1] += 1
				}
				if i-1 >= 0 && j-1 >= 0 && src[i-1][j-1] != '*' {
					src[i-1][j-1] += 1
				}
				if i-1 >= 0 && j+1 < m && src[i-1][j+1] != '*' {
					src[i-1][j+1] += 1
				}
				if i+1 < n && j+1 < m && src[i+1][j+1] != '*' {
					src[i+1][j+1] += 1
				}
				if i+1 < n && j-1 >= 0 && src[i+1][j-1] != '*' {
					src[i+1][j-1] += 1
				}
			}
		}
	}
	for i := range src {
		fmt.Println(string(src[i]))
	}
}

Python3 解法, 执行用时: 1883ms, 内存消耗: 12756K, 提交时间: 2023-08-12 13:03:53

n, m = map(int, input().split())
a = [['.'] * (m + 2) for i in range(n + 2)]
b = []
for i in range(n):
    b.append(input())
for i in range(n):
    for j in range(m):
        a[i + 1][j + 1] = b[i][j]
for i in range(1, n + 1):
    for j in range(1, m + 1):
        if a[i][j] == '.':
            a[i][j] = (a[i - 1][j - 1:j + 2] + a[i][j - 1:j + 2] + a[i + 1][j - 1:j + 2]).count('*')
for i in range(n):
    tem_str = ''
    for j in range(m):
        tem_str += str(a[i+1][j+1])
    print(tem_str)

Java 解法, 执行用时: 350ms, 内存消耗: 24356K, 提交时间: 2023-08-12 13:03:32

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int m=in.nextInt();
		int [][]a=new int[n+2][m+2];
		for(int i=1;i<=n;i++)
		{
			String b=in.next();
            for(int j = 1; j <=m; j++) {
            	a[i][j]=b.charAt(j-1)=='*'?1:0;
            }
        }
		StringBuilder c = new StringBuilder();
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(a[i][j]==1)c.append("*");
				else c.append(a[i-1][j]+a[i-1][j-1]+a[i][j-1]+a[i][j+1]+a[i-1][j+1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1]);
			}
			c.append("\n");
		}
		System.out.println(c);
	}
}

C++ 解法, 执行用时: 45ms, 内存消耗: 2072K, 提交时间: 2023-08-12 13:03:08

#include<stdio.h> 
int main()
{
	char a[1005][1005];
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	    scanf("%s",a[i]+1);
	for(int i=1;i<=n;i++) {
    	for(int j=1;j<=m;j++) {
    		int ans=0;
    		if(a[i][j]=='.') {
    			for(int p=i-1;p<=i+1;p++)
    			for(int q=j-1;q<=j+1;q++)
    				if(a[p][q]=='*') ans++;
    				printf("%d",ans);
    		}
    		else printf("*");
    	}
	    putchar(10);
	}
}

上一题