C++程序:找出最大化网格中偶数单元格数量的操作次数
假设我们给定一个维度为h * w的网格。网格中的每个单元格都分配了一个特定值。我们必须最大化具有偶数值的单元格数量。为此,我们可以选择一个以前未被选择的单元格,然后将当前单元格的值减少1,并将位于当前单元格垂直或水平相邻的另一个单元格的值增加1。我们打印操作次数以及增加和减少操作的单元格编号。输出格式如下:
操作次数
第1个(减少的单元格位置) - (增加的单元格位置)
....
第n个(减少的单元格位置) - (增加的单元格位置)
因此,如果输入像h = 3,w = 3,grid = {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}},则输出将为
4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)
步骤
为了解决这个问题,我们将遵循以下步骤:
Define a new array result that contains a tuple for initialize i := 0, when i < h, update (increase i by 1), do: tp := 0 for initialize j := 0, when j < w, update (increase j by 1), do: if tp > 0, then: insert tuple(i, j - 1, i, j) at the end of result grid[i, j] := grid[i, j] + tp if grid[i, j] mod 2 is same as 1 and j < w-1, then: grid[i, j] := grid[i, j] - 1 tp := 1 Otherwise tp := 0 tp := 0 for initialize i := 0, when i < h, update (increase i by 1), do: if tp > 0, then: insert tuple(i - 1, w - 1, i, w - 1) at the end of result grid[i, w - 1] := grid[i, w - 1] + tp if grid[i, w - 1] mod 2 is same as 1, then: grid[i, w - 1] := grid[i, w - 1] - 1 tp := 1 Otherwise tp := 0 print(size of result) for initialize i := 0, when i < size of result, update (increase i by 1), do: print('(' + first value of result[i] + ',' + second value of result[i] + '- (' + third value of result[i] + ',' + fourth value of result[i])
示例
让我们看看下面的实现,以便更好地理解:
#include <bits/stdc++.h> using namespace std; void solve(int h, int w, vector<vector<int>>grid){ vector<tuple<int,int,int,int>> result; for(int i = 0; i < h; i++){ int tp = 0; for(int j = 0; j < w; j++){ if(tp > 0){ result.push_back(make_tuple(i, j-1, i, j)); grid[i][j] += tp; } if(grid[i][j]%2 == 1 && j < w-1){ grid[i][j] -= 1; tp = 1; } else tp = 0; } } int tp = 0; for(int i = 0; i < h; i++){ if(tp > 0){ result.push_back(make_tuple(i-1, w-1, i, w-1)); grid[i][w-1] += tp; } if(grid[i][w-1]%2 == 1){ grid[i][w-1] -= 1; tp = 1; } else tp = 0; } cout << (int)result.size() << endl; for(int i = 0; i < (int)result.size(); i++){ cout << "(" << get<0>(result[i]) << ", " << get<1>(result[i]) << ")" << " - (" << get<2>(result[i]) << ", " << get<3>(result[i]) << ")"; cout << '\n'; } } int main() { int h = 3, w = 3 ; vector<vector<int>> grid = {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}; solve(h, w, grid); return 0; }
输入
3, 3, {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}
输出
4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)
广告