起初想法时暴力搜索,但是忽略了数据范围,直接给T了。当时还硬着头皮想推出个什么公式加上搜索做出来,
到后来看到题解后才发现递推才是正道。不过递推的顺序是从下往上来的,从上往下来也可以,不过很麻烦。
从下往上走,每当碰到一棵云杉点的时候这个点就是它下面三个点的最小值 +1,如果不是云杉点,那么就要
将这个点的值设为0,因此还需要一个整数数组用来统计。
#include <bits/stdc++.h> using namespace std; const int N = 505; char maze[N][N]; int ans[N][N]; int n, m; int check(int x, int y){ if(maze[x][y] != '*') return 0; if(maze[x][y] == '*') if(x == n || y == 1 || y == m) return 1; int minn = 0x3f3f3f3f; for(int i = y - 1; i <= y + 1; i ++) minn = min(minn, ans[x + 1][i] + 1); return minn; } int main(){ int t; cin >> t; while(t --){ memset(ans, 0, sizeof ans); cin >> n >> m; for(int i = 1; i <= n; i ++) cin >> maze[i] + 1; int res = 0; for(int i = n; i >= 1; i --){ for(int j = 1; j <= m; j ++){ res += check(i, j); ans[i][j] = check(i, j); } } cout << res << endl; } return 0; }