请用C++解决以下问题:给定一个 n×n 的网格,格子中的数为0或1. 每一次操作可以选定一个填入 0 的格子,将 0 改成 1 .求要使每个数四周都有偶数个1,需要的最小操作次数
时间: 2024-10-07 10:02:23 浏览: 105
这个问题是一个经典的动态规划问题,通常可以用一个二维数组来表示网格,并通过迭代来更新操作次数。这里我们可以创建一个辅助数组,其中 dp[i][j] 表示从左上角到 (i, j) 的最小子操作次数,使得该位置及其正上方、正下方、左方和右方有偶数个 1。
以下是使用 C++ 解决这个问题的一种思路:
```cpp
#include <vector>
using namespace std;
int minOperations(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> dp(m, vector<int>(n, INT_MAX));
dp[0][0] = grid[0][0];
for (int i = 1; i < m; ++i) {
if (grid[i][0] == 1) {
dp[i][0] = dp[i - 1][0];
} else {
dp[i][0] = min(dp[i - 1][0], 1 + dp[i - 1][1]);
}
}
for (int j = 1; j < n; ++j) {
if (grid[0][j] == 1) {
dp[0][j] = dp[0][j - 1];
} else {
dp[0][j] = min(dp[0][j - 1], 1 + dp[1][j]);
}
}
// 递推过程
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
if (grid[i][j] == 1) {
dp[i][j] = min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1], dp[i][j]});
} else {
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), 1 + dp[i - 1][j - 1]);
}
}
}
return dp[m - 1][n - 1];
}
阅读全文