NC214177. 扫雷X
描述
输入描述
第一行是用一个空格隔开的两个整数和,分别表示雷区的行数和列数。接下来行,每行个数字,描述了雷区中的地雷分布情况。数字表示相应格子是地雷格,数字表示相应格子是非地雷格。
输出描述
输出包含行,每行个数字,描述整个雷区。用表示地雷格,用以非地雷格为中心X型区域的地雷个数表示非地雷格。
示例1
输入:
6 6 -1 0 -1 0 -1 -1 0 -1 0 0 -1 -1 0 -1 0 0 0 0 -1 0 -1 0 0 0 0 0 0 0 -1 0 0 0 0 -1 0 -1
输出:
-1 0 -1 3 -1 -1 2 -1 2 2 -1 -1 3 -1 5 3 2 1 -1 2 -1 5 0 3 1 4 2 2 -1 0 3 1 1 -1 2 -1
说明:
C(clang11) 解法, 执行用时: 6ms, 内存消耗: 504K, 提交时间: 2021-02-07 10:34:00
#include <stdio.h> long long ch[105][105]; long long out[105][105]; int main() { int x,y,a,b; scanf("%d %d",&x,&y); for (a=0;a<x;a++){ for (b=0;b<y;b++){ scanf("%lld",&ch[a][b]); } } for (a=0;a<x;a++){ for (b=0;b<y;b++){ if (ch[a][b]==-1){ int c,d; d=b; for (c=a;c<x-1;c++){ if (d==y) break; out[c+1][d+1]++; d++; } d=b; for (c=a;c<x-1;c++){ if (d==0) break; out[c+1][d-1]++; d--; } d=b; for (c=a;c>0;c--){ if (d==0) break; out[c-1][d-1]++; d--; } d=b; for (c=a;c>0;c--){ if (d==y) break; out[c-1][d+1]++; d++; } } } } for (a=0;a<x;a++){ for (b=0;b<y-1;b++){ if (ch[a][b]==-1) printf("-1 "); else printf("%lld ",out[a][b]); } if (ch[a][y-1]==-1) printf("-1\n"); else printf("%lld\n",out[a][y-1]); } }
C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 392K, 提交时间: 2020-12-06 13:44:57
#include <iostream> #include <algorithm> using namespace std; int map[105][105],dx[]={1,1,-1,-1},dy[]={1,-1,1,-1}; int main() { int n,m,a,b,cnt; cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(map[i][j]==0) { cnt=0; for(int k=0;k<4;k++) { a=i;b=j; while(a>0&&b>0&&a<=n&&b<=m) { a+=dx[k];b+=dy[k]; if(a>0&&b>0&&a<=n&&b<=m&&map[a][b]==-1)cnt++; } } map[i][j]=cnt; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%d ",map[i][j]); putchar('\n'); } return 0; }
Python3(3.9) 解法, 执行用时: 335ms, 内存消耗: 3208K, 提交时间: 2020-12-06 13:29:10
from itertools import product (n, m) = map(int, input().split()) board = [] for _ in range(n): row = list(map(int, input().split())) board.append(row) for i in range(n): for j in range(m): if board[i][j] == -1: continue for (dir_x, dir_y) in product([-1, 1], [-1, 1]): for num in range(max(n, m)): x = i + dir_x * num y = j + dir_y * num if not (x in range(n) and y in range(m)): break board[i][j] += (board[x][y] == -1) for row in board: print(*row)