篮球杯模拟赛

本文介绍了一种使用深度优先搜索解决的问题,小蓝在一个有整数标记的网格图中移动,只能向相邻方格移动,当相邻方格的最大公约数大于1时。文章详细描述了如何通过DFS算法计算小蓝可以到达的方格总数。
摘要由CSDN通过智能技术生成

小蓝站在一个n行m列的方格图中间,方格图的每一个方格上都标有一个正整数。\n如果两个相邻方格(上下左右四个方向相邻)内的数的最大公约数大于1,则可以从其中一个方格移动到另一个方格,当然也可以从另一个方格移回第一个方格。\n假设小蓝开始时站在第r行第c列,请问小蓝可以移动到方格图内的多少个方格? 

 

要解决这个问题,我们可以使用深度优先搜索(DFS)算法。我们需要从起点开始,探索所有可能的移动路径,并且在移动过程中记录已经访问过的方格,以避免重复访问。由于题目要求我们找出小蓝可以移动到的方格数量,我们可以在DFS过程中使用一个计数器来记录访问过的方格数量。

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

const int MAXN = 100; // 假设方格图的最大行数和列数不会超过100

int n, m;

vector<vector<int>> grid(MAXN, vector<int>(MAXN, 0));

bool visited[MAXN][MAXN] = {false};

// 计算两个数的最大公约数

int gcd(int a, int b) {

    return b == 0 ? a : gcd(b, a % b);

}

// 深度优先搜索

void dfs(int r, int c, int count) {

    visited[r][c] = true;

    count++; // 访问当前方格,计数器加1

    // 遍历四个方向

    int dr[] = {-1, 0, 1, 0};

    int dc[] = {0, 1, 0, -1};

    for (int i = 0; i < 4; ++i) {

        int nr = r + dr[i];

        int nc = c + dc[i];

        // 检查新位置是否在方格图内,且未被访问过,且相邻方格的最大公约数大于1

        if (nr >= 0 && nr < n && nc >= 0 && nc < m && !visited[nr][nc] && gcd(grid[r][c], grid[nr][nc]) > 1) {

            dfs(nr, nc, count);

        }

    }

}

int main() {

    // 输入方格图的大小

    cin >> n >> m;

    // 输入方格图的内容

    for (int i = 0; i < n; ++i) {

        for (int j = 0; j < m; ++j) {

            cin >> grid[i][j];

        }

    }

    // 输入小蓝的起始位置

    int r, c;

    cin >> r >> c;

    // 从起点开始DFS

    dfs(r, c, 0);

    // 输出小蓝可以移动到的方格数量

    cout << "Number of reachable cells: " << visited[r][c] << endl;

    return 0;

}

首先定义了一个`gcd`函数来计算两个数的最大公约数。然后定义了一个`dfs`函数来进行深度优先搜索,它接受当前的行和列坐标以及一个计数器。在`dfs`函数中,我们标记当前方格为已访问,并递增计数器。然后,我们遍历四个方向,检查相邻方格是否在方格图内、未被访问过,以及它们的最大公约数是否大于1。如果是,我们就递归地调用`dfs`函数。

在`main`函数中,我们首先输入方格图的大小和内容,然后输入小蓝的起始位置。接着,我们从起点开始进行DFS,并在最后输出小蓝可以移动到的方格数量。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值