CF1461B Find the Spruce

题目描述

假期即将来临。Rick 意识到是时候考虑购买一棵传统的云杉树了。但 Rick 不想伤害真正的树,所以他决定在一个 $n \times m$ 的矩阵中寻找一些由 “\*” 和 “.” 组成的云杉树。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1461B/0f830498ab169a471030eeb85fc12c395e76f5ca.png) 在寻找每一棵云杉树之前,我们先来定义矩阵中的云杉树。若一组矩阵单元格构成了以点 $(x, y)$ 为起点、高度为 $k$ 的云杉树,则需满足: - 该集合内的所有单元格均为 “\*”。 - 对于每个 $1 \le i \le k$,所有第 $x+i-1$ 行、列号在 $[y-i+1, y+i-1]$ 范围内的单元格都属于该集合。其他单元格不能属于该集合。 以下是正确和错误的云杉树示例: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1461B/2ce2df8e09c4fc74a3e149e5906821e41a5e552f.png) 现在 Rick 想知道他的 $n \times m$ 矩阵中一共有多少棵云杉树。请你帮助 Rick 解决这个问题。

输入格式

每组测试数据包含一个或多个测试用例。第一行为测试用例数 $t$($1 \le t \le 10$)。 每个测试用例的第一行为两个整数 $n$ 和 $m$($1 \le n, m \le 500$),表示矩阵的大小。 接下来每个测试用例包含 $n$ 行,每行包含 $m$ 个字符 $c_{i, j}$,表示矩阵的内容。保证 $c_{i, j}$ 仅为 “.” 或 “\*”。 保证所有测试用例中 $n \cdot m$ 的总和不超过 $500^2$($\sum n \cdot m \le 500^2$)。

输出格式

对于每个测试用例,输出一个整数,表示矩阵中云杉树的总数。

说明/提示

在第一个测试用例中,高度为 $2$ 的第一棵云杉树的起点在 $(1, 2)$,高度为 $1$ 的第二棵云杉树的起点也在 $(1, 2)$,高度为 $1$ 的第三棵云杉树的起点在 $(2, 1)$,高度为 $1$ 的第四棵云杉树的起点在 $(2, 2)$,高度为 $1$ 的第五棵云杉树的起点在 $(2, 3)$。 在第二个测试用例中,高度为 $1$ 的第一棵云杉树的起点在 $(1, 2)$,高度为 $1$ 的第二棵云杉树的起点在 $(2, 1)$,高度为 $1$ 的第三棵云杉树的起点在 $(2, 2)$。 由 ChatGPT 4.1 翻译