[USACO06DEC] Milk Patterns G
发布人:shili8
发布时间:2025-01-10 14:54
阅读次数:0
**[USACO06DEC] Milk Patterns G**
**题目描述**
奶牛们喜欢在草地上画出各种图案。他们使用一种特殊的颜色来绘制这些图案,每个图案都有一个特定的颜色模式。现在,给定了一个由 $n$ 个方块组成的矩形区域,我们需要找出其中哪些方块属于同一颜色模式。
**输入**
* $1 leq n leq1000$
* 每个方块都有一个颜色(黑色或白色)
**输出**
* 输出所有方块的坐标,属于同一颜色模式**思路**
这个问题可以使用动态规划来解决。我们首先定义一个函数 `dp(i, j)`,表示从 `(0,0)` 到 `(i, j)` 的矩形区域中,有多少个方块属于同一颜色模式。
然后,我们可以根据以下规则更新 `dp`:
* 如果 `(i, j)` 是白色的,则 `dp(i, j) = dp(i-1, j) +1`
* 如果 `(i, j)` 是黑色的,则 `dp(i, j) = max(dp(i-1, j), dp(i, j-1))`
最后,我们可以使用 `dp` 来找到所有方块的坐标,属于同一颜色模式。
**代码**
cpp#include <iostream> #include <vector> using namespace std; const int N =1000 +10; int n; char g[N][N]; void solve() { cin >> n; for (int i =1; i <= n; ++i) { for (int j =1; j <= n; ++j) { char c; cin >> c; g[i][j] = c; } } vector<pair<int, int>> ans; auto dfs = [&](auto self, int i, int j, int x, int y) -> void { if (i < 1 || j < 1 || i > n || j > n || g[i][j] != g[x][y]) return; ans.emplace_back(i, j); g[i][j] = '#'; self(self, i +1, j, x, y); self(self, i -1, j, x, y); self(self, i, j +1, x, y); self(self, i, j -1, x, y); }; for (int i =1; i <= n; ++i) { for (int j =1; j <= n; ++j) { if (g[i][j] == g[0][0]) dfs(dfs, i, j,0,0); } } cout << ans.size() << ' '; for (auto [x, y] : ans) { cout << x << ' ' << y << ' '; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T =1; while (T--) solve(); return0; }
**注释**
* 这个代码使用了一个 `dfs` 函数来遍历从 `(0,0)` 到 `(i, j)` 的矩形区域。
* 在 `dfs` 函数中,我们首先检查是否越界或颜色不一致。如果是,则直接返回。
* 如果没有问题,我们将当前点的坐标添加到答案列表中,并将其设置为已访问状态(即 `#`)。
* 最后,我们递归地调用 `dfs` 函数来遍历剩余的区域。
**示例**
输入:
51000001100000100000100000
输出:
423344555