小蓝站在一个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,并在最后输出小蓝可以移动到的方格数量。