题目链接
Codeforces Round #689 (Div. 2, based on Zed Code Competition)-B. Find the Spruce
Description
- Holidays are coming up really soon. Rick realized that it’s time to think about buying a traditional spruce tree. But Rick doesn’t want real trees to get hurt so he decided to find some in an n×m matrix consisting of “*” and “.”.
To find every spruce first let’s define what a spruce in the matrix is. A set of matrix cells is called a spruce of height k with origin at point (x,y) if:
All cells in the set contain an "".
For each 1≤i≤k all cells with the row number x+i−1 and columns in range [y−i+1,y+i−1] must be a part of the set. All other cells cannot belong to the set.
Input
- Each test contains one or more test cases. The first line contains the number of test cases t (1≤t≤10).
The first line of each test case contains two integers n and m (1≤n,m≤500) — matrix size.
Next n lines of each test case contain m characters ci,j — matrix contents. It is guaranteed that ci,j is either a “.” or an “*”.
It is guaranteed that the sum of n⋅m over all test cases does not exceed 500^2 (∑n⋅m≤500^2).
Output
- For each test case, print single integer — the total number of spruces in the matrix.
输入
4
2 3
.*.
***
2 3
.*.
**.
4 5
.***.
*****
*****
*.*.*
5 7
..*.*..
.*****.
*******
.*****.
..*.*..
输出
5
3
23
34
思路
- 思路:实际上可以把题目意思转化为所有以"*"的点为树的顶点所能构成的云杉树的深度的和,例如样例一,第一排中间的"*“为顶点构成的树的深度为2,而第二排中间的”*"为顶点构成的树的深度为1所以ans=2+1+1+1=5
- 方法:对每一个“*”用 dfs搜索 树的深度,因为要保证树完整所以dfs返回值为最小的树的深度+1。
- 注意:要用记忆化搜索(二维数组dp储存dfs的值,避免重复搜索造成时间浪费),不然会超时。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn =