当前位置:实例文章 » 其他实例» [文章][USACO06DEC] Milk Patterns G

[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

相关标签:
其他信息

其他资源

Top