AC求优化
查看原帖
AC求优化
1050776
peterJr楼主2023/9/5 19:23

现在是AC, 发现时间复杂度是O(nm)O(nm), 计算次数为n×m×4n \times m \times 4, 代入n=100n=100,m=100m=100则得出计算次数最大TT为 max⁡T=4nm\max{T}=4nm =4×100×100=4 \times 100 \times 100 =4×10000=4 \times 10000 =40000=40000 可在40000÷1×109=0.0440000 \div 1 \times 10^9=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;
} 
2023/9/5 19:23
加载中...