NC52069. 扫雷
描述
小sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵,他希望你帮他生成一个扫雷矩阵。
扫雷矩阵的每一行每一列都是一个数字,每个数字的含义是与当前位置相邻的8个方向中,有多少个雷(在下图中,雷用*表示);如果当前位置就是雷的话,仍输出一个*。
....
..**
*.*.
0122
13**
*4*4
输入描述
第一行两个整数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); } }