#1470. 珅泽教育CSP-J第一轮模拟考第一套 第 44 题

珅泽教育CSP-J第一轮模拟考第一套 第 44 题

第2题

给定一个网格,该网格由 n×mn\times m 个方格组成,每个方格内有一个正整数,其中第 ii 行第 jj 列的整数为 ai,ja_{i,j}。我们可以使用任意多块 1×21\times 2 的骨牌覆盖网格上的数字,每块骨牌不得重叠,也不能越过网格的边界。被骨牌覆盖的数字就消失了。请问应该如何摆放骨牌,使得没有消失的数字的异或之和达到最大。所谓异或,就是 C++ 的 ^ 操作。注意不覆盖任何骨牌也是一种选择。

#include<iostream>

int a[20][20];
bool covered[20][20];
int n, m;

int solve(int x, int y, int sum)
{
    if (y == m) {
        return ____②____;
    }
    if (____③____) {
        return sum;
    }
    int D = 0;
    if ( covered[x][y] )
        D = solve(x, y+1, sum);
    else
        D = ____④____;
    int V = 0;
    int H = 0;
    if (!covered[x][y] && y+1 < m && !covered[x][y+1])
    {
        covered[x][y] = covered[x][y+1] = true;
        V = ____⑤____;
        covered[x][y] = covered[x][y+1] = false;
    }
    if (!covered[x][y] && x+1 < n)
    {
        covered[x][y] = covered[x+1][y] = true;
        H = ____⑥____;
        covered[x][y] = covered[x+1][y] = false;
    }
    return std::max(D, std::max(H, V));
}

int main(){
    std::cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            std::cin >> a[i][j];
        }
    }
    std::cout << ____①____ << "\n";
}

⑤ 处应填( )。

{{ select(1) }}

  • solve(x, y+1, sum ^ a[x][y])
  • solve(x+1, y, sum ^ a[x][y])
  • solve(x, y+1, sum)
  • solve(x+1, y, sum)