现在是AC, 发现时间复杂度是O(nm), 计算次数为n×m×4, 代入n=100,m=100则得出计算次数最大T为 maxT=4nm =4×100×100 =4×10000 =40000 可在40000÷1×109=0.04s内完成,求dalao优化
#include <bits/stdc++.h>
#define N 107
#define M 107
using namespace std;
char mp[N][M];
int a[N][M],n, m;
const int dir[10][2] = {{0, 0}, {1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {-1, 1}, {1, -1}, {-1, -1}};
int dp(int s, int t, int r, int v) {
// s -> x; t -> y; r -> edge_x; v -> edge_y;
return s >= 0 && s <= r && t >= 0 && t <= v;
}
int main(void) {
cin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
cin >> mp[i][j];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (mp[i][j] == '*')
for (int k = 1; k <= 8; ++k) {
int dx = i + dir[k][0];
int dy = j + dir[k][1];
if (dp(dx, dy, n, m) && mp[dx][dy] != '*')
++a[dx][dy];
}
else if (mp[i][j] == '?') continue;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j)
if (mp[i][j] == '*') cout << '*';
else cout << a[i][j];
cout << endl;
}
return 0;
}