学而思编程周赛语言普及奠基组 | 2025年春第2周T3 全都为1

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:学而思编程周赛普及奠基组 | 汇总


【题目描述】

小猴和朋友正在玩一个游戏,初始时,在一个 n × n n×n n×n 的棋盘上放置着 n × n n×n n×n 个棋子,棋子只有黑色和白色两种,其中棋盘左上角的坐标为 ( 1 , 1 ) (1,1) (1,1),右下角的坐标为 ( n , n ) (n,n) (n,n)

小猴可以进行任意次操作,每次操作小猴会在棋盘内选择一个位置 ( x , y ) (x,y) (x,y),然后将该位置与棋盘右下角 ( n , n ) (n,n) (n,n) 形成的矩形范围内所有棋子进行更换为颜色相反的棋子,即白色棋子换成黑色棋子,黑色棋子换成白色棋子。

我们使用数字 0 0 0 代表白色棋子,数字 1 1 1 代表黑色棋子,则有如下例子:

在这里插入图片描述

如上图,选择坐标为 ( 3 , 2 ) (3,2) (3,2) 的位置,这样就将整个棋盘的棋子全部变成黑色。

请问小猴最少需要操作多少次,才能使得整个 n × n n×n n×n 的棋盘中的所有棋子都为黑色。

【输入】

第一行,包含一个整数 n n n

接下来 n n n 行,每行 n n n 个整数 a i , 1 , a i , 2 , … , a i , n a_{i,1},a_{i,2},…,a_{i,n} ai,1,ai,2,,ai,n,其中 a i , j a_{i,j} ai,j 表示棋盘位置坐标为 ( i , j ) (i,j) (i,j) 的棋子颜色, 0 0 0 表示白色, 1 1 1 表示黑色。

【输出】

一行,包含一个整数,表示小猴最少需要操作的步数。

【输入样例】

4
1 1 1 1
1 1 1 1
1 0 0 0
1 0 0 0

【输出样例】

1

【解题思路】

在这里插入图片描述

【算法标签】

《小猴周赛 全都为1》 #递推#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int n;              // n 表示矩阵的大小
int a[2005][2005];  // a[i][j] 表示矩阵的第 i 行第 j 列的元素
int f[2005][2005];  // f[i][j] 表示从 (1,1) 到 (i,j) 的子矩阵中满足条件的元素数量

int main()
{
    // 输入矩阵的大小
    cin >> n;

    // 输入矩阵的元素
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cin >> a[i][j];
        }
    }

    // 动态规划求解
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            // 计算 f[i][j] 的初始值
            f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];

            // 根据 f[i-1][j] + f[i][j-1] - f[i-1][j-1] 的奇偶性更新 f[i][j]
            if (f[i][j] % 2 == 1)  // 如果是奇数
            {
                if (a[i][j] == 1) f[i][j]++;  // 如果 a[i][j] 是 1,则 f[i][j] 加 1
            }
            else  // 如果是偶数
            {
                if (a[i][j] == 0) f[i][j]++;  // 如果 a[i][j] 是 0,则 f[i][j] 加 1
            }
        }
    }

    // 输出结果
    cout << f[n][n] << endl;

    return 0;
}

【运行结果】

4
1 1 1 1
1 1 1 1
1 0 0 0
1 0 0 0
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值