c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固

目录

构造

构造的基础概念:

模拟

练习1:扫雷

练习2:灌溉

练习3:回文日期


构造

构造的基础概念:

构造算法是一种用于解决特定问题的算法设计方法。在C++语言中,构造算法通常涉及到创建一个函数或类来实现特定的功能。以下是一个用C++语言详细介绍构造算法的示例:

java 复制代码
#include <iostream>
#include <vector>

// 定义一个函数来实现构造算法
void constructAlgorithm(std::vector<int>& nums) {
    int n = nums.size();
    
    // 在这里实现构造算法的具体逻辑
    for (int i = 0; i < n; i++) {
        nums[i] = i * i;
    }
}

int main() {
    // 创建一个包含一定数量元素的向量
    std::vector<int> nums = {1, 2, 3, 4, 5};
    
    // 调用构造算法函数来处理向量中的元素
    constructAlgorithm(nums);
    
    // 输出处理后的向量元素
    for (int i = 0; i < nums.size(); i++) {
        std::cout << nums[i] << " ";
    }
    
    return 0;
}

在上面的示例中,我们定义了一个名为constructAlgorithm的函数来实现构造算法的逻辑。在main函数中,我们创建了一个包含一定数量元素的向量,并调用constructAlgorithm函数来处理向量中的元素。最后,我们输出处理后的向量元素。

通过这种方式,我们可以使用C++语言来实现构造算法,解决特定问题并实现所需的功能。


模拟

模拟算法是一种通过模拟真实世界情况来解决问题的方法。在C++中,可以通过编写代码来模拟算法的思路。

以下是一个简单的示例,介绍如何用C++代码实现一个简单的模拟算法:

cpp 复制代码
#include <iostream>

int main() {
    // 模拟一个简单的情况,假设有5个人排队等待进入电影院
    int queue[5] = {1, 2, 3, 4, 5};

    // 模拟每个人进入电影院的过程
    for (int i = 0; i < 5; i++) {
        std::cout << "Person " << queue[i] << " enters the cinema." << std::endl;
    }

    // 模拟电影播放结束,人们陆续离开电影院
    for (int i = 0; i < 5; i++) {
        std::cout << "Person " << queue[i] << " leaves the cinema." << std::endl;
    }

    return 0;
}

在这个示例中,我们模拟了一个简单的场景:5个人排队等待进入电影院,然后陆续进入电影院观影,最后陆续离开电影院。通过这个简单的例子,展示了如何用C++代码实现模拟算法的思路。在实际应用中,可以根据具体问题的情况,编写相应的模拟算法代码。

练习1:扫雷

1.扫雷 - 蓝桥云课 (lanqiao.cn)

答案和思路:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int arr[105][105],ans[105][105];
int main()
{
    // 输入n和m的值
    cin>>n>>m;

    // 输入矩阵arr的值
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>arr[i][j];
        }
    }

    // 计算每个位置周围的1的个数
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(arr[i][j]==1)
            {
                ans[i][j]=9; // 如果当前位置为1,则置为9
                continue;
            }
            for(int _i=max(0,i-1);_i<=min(n,i+1);_i++)
            {
                for(int _j=max(0,j-1);_j<=min(m,j+1);_j++)
                {
                    if(arr[_i][_j]==1) ans[i][j]++; // 统计周围1的个数
                }
            }
        }
    }

    // 输出ans矩阵
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cout<<ans[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

练习2:灌溉

1.灌溉 - 蓝桥云课 (lanqiao.cn)

思路和代码:

cpp 复制代码
思路:定义两个数组,用1记录初始水方块a,根据题意跟新对应水方块,用更新完的水方块b覆盖a,再次迭代,直到次数结束,在规定范围内统计水方块个数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, m; // 定义矩阵的行数和列数
    cin >> n >> m; // 输入矩阵的行数和列数

    int t; // 定义初始时有多少个位置为1
    cin >> t; // 输入初始时有多少个位置为1

    int a[105][105], b[105][105]; // 定义两个矩阵a和b

    // 输入初始位置为1的坐标
    for (int i = 1; i <= t; i++)
    {
        int x, y;
        cin >> x >> y;
        a[x][y] = 1; // 将指定位置置为1
    }

    int k; // 定义迭代次数
    cin >> k; // 输入迭代次数

    while (k--)
    {
        // 更新矩阵b
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (a[i][j])
                {
                    b[i][j] = b[i - 1][j] = b[i][j - 1] = b[i][j + 1] = b[i + 1][j] = 1;
                }
            }
        }

        // 更新矩阵a
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                a[i][j] = b[i][j];
            }
        }
    }

    // 统计最终有多少个位置为1
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == 1) ans++;
        }
    }

    // 输出最终结果
    cout << ans << endl;
    return 0;
}

特别注意:数组从a[1][1]开始传入,i=0和j=0的位置空出,即使更新的时候溢出规定范围也没关系,注意统计时的边界就行。

练习3:回文日期

3.回文日期 - 蓝桥云课 (lanqiao.cn)

思路和代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

// 判断是否为闰年
bool isleap(int y)
{
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

// 检查日期是否合法
bool check(int year, int month, int day)
{
    if (month > 12 || month == 0) return false;
    if (month == 2)
    {
        if (isleap(year) && day > 29) return false;
        if (!isleap(year) && day > 28) return false;
    }
    if (day > 31) return false;
    if (month == 4 || month == 6 || month == 9 || month == 11)
    {
        if (day > 30) return false;
    }
    return true;
}

int main()
{
    int n;
    cin >> n;
    int a, b, c, d, e, f, g, h;
    int year, month, day;
    bool flag = false;
    for (int i = n + 1; i <= 99999999; i++)
    {
        year = i / 10000;
        month = (i % 10000) / 100;
        day = i % 100;
        a = i % 10;
        b = (i / 10) % 10;
        c = (i / 100) % 10;
        d = (i / 1000) % 10;
        e = (i / 10000) % 10;
        f = (i / 100000) % 10;
        g = (i / 1000000) % 10;
        h = (i / 10000000) % 10;
        if (a == h && b == g && c == f && d == e && flag == false)
        {
            if (check(year, month, day))
            {
                cout << i << endl;
                flag = true;
            }
        }
        if (a == h && b == g && c == f && d == e && a == c && b == d)
        {
            if (check(year, month, day))
            {
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}
相关推荐
晓纪同学33 分钟前
QT-简单视觉框架代码
开发语言·qt
威桑34 分钟前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服37 分钟前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生43 分钟前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans1 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
Chinese Red Guest1 小时前
python
开发语言·python·pygame
一棵星2 小时前
Java模拟Mqtt客户端连接Mqtt Broker
java·开发语言
别NULL2 小时前
机试题——疯长的草
数据结构·c++·算法