华为OD机试【机器人活动区域】
题目描述
现有一个机器人,可放置于 M x N 的网格中任意位置
每个网格包含一个非负整数编号,
当相邻网格的数字编号差值的绝对值小于等于 1 时
机器人可以在网格间移动。
问题: 求机器人可活动的最大范围对应的网格点数目。
说明:
网格左上角坐标为(0,0),右下角坐标为(m - 1,n - 1)机器人只能在相邻网格间上下左右移动
输入描述
第 1 行入为 M 和, M 表示网格的行数 N表示网格的列数之后 M 行表示网格数值,每行 N 个数值 (数值大小用 k 表示)数值间用单个空格分隔,行首行尾无多余空格。
M、N、k 均为整数,月1<=M,N<=150 0<=k<=50
输出描述
输出 1行,包含 1个数字,表示最大活动区域的网格点数目
行首行尾无多余空格。
示例1
4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4
输出
6
DFS
#include <bits/stdc++.h> using namespace std; int m, n; void dfs(int i, int j, vector<vector<int>> v,vector<vector<int>> &rd,int &tmp) { int a = v[i][j]; rd[i][j]++; tmp++; if (i + 1 < m && rd[i + 1][j]==0 && abs(v[i+1][j] - a) <= 1)//继续DFS条件都是不超过边界&&该点未访问过&&差值<=1 dfs(i+1, j, v, rd,tmp); if (i - 1 >= 0 && rd[i - 1][j] == 0 && abs(v[i-1][j] - a) <= 1) dfs(i-1, j, v, rd,tmp); if (j + 1 < n && rd[i][j + 1] == 0 && abs(v[i][j+1] - a) <= 1) dfs(i, j+1, v, rd, tmp); if (j - 1 >= 0 && rd[i][j - 1] == 0 && abs(v[i][j-1] - a) <= 1) dfs(i, j-1, v, rd, tmp); } int main() { int count=0; cin >> m >> n; vector<vector<int>>v(m,vector<int>(n)); vector<vector<int>>rd(m, vector<int>(n,0));//记录点是否被访问过 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> v[i][j]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (rd[i][j] == 0) { vector<vector<int>>rd(m, vector<int>(n, 0));//重置记录数组 int tmp=0;//tmp用于记录该次DFS所得可行走范围大小 dfs(i, j, v, rd, tmp); } count = max(count, tmp);//记录最大可行走范围 } } cout << count; }
增加一个RD2记录数组减少递归次数
void dfs(int i, int j, vector<vector<int>> v,vector<vector<int>> &rd, vector<vector<int>> &rd2,int &tmp) { int a = v[i][j]; rd[i][j]++; rd2[i][j]++; tmp++; if (i + 1 < m && rd[i + 1][j]==0 && abs(v[i+1][j] - a) <= 1) dfs(i+1, j, v, rd,rd2,tmp); if (i - 1 >= 0 && rd[i - 1][j] == 0 && abs(v[i-1][j] - a) <= 1) dfs(i-1, j, v, rd,rd2,tmp); if (j + 1 < n && rd[i][j + 1] == 0 && abs(v[i][j+1] - a) <= 1) dfs(i, j+1, v, rd,rd2, tmp); if (j - 1 >= 0 && rd[i][j - 1] == 0 && abs(v[i][j-1] - a) <= 1) dfs(i, j-1, v, rd,rd2, tmp); } int main() { int count=0; cin >> m >> n; vector<vector<int>>v(m,vector<int>(n)); vector<vector<int>>rd(m, vector<int>(n, 0)); vector<vector<int>>rd2(m, vector<int>(n, 0)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> v[i][j]; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (rd2[i][j] == 0) { vector<vector<int>>rd(m, vector<int>(n, 0)); int tmp = 0; dfs(i, j, v, rd,rd2, tmp); count = max(count, tmp); } } } cout << count; }