前言:
该题取自洛谷P1123,题主用的dfs(深度优先搜索)
题目描述:
数据范围:
思路:
思路见代码,注释的很清晰嗷
AC代码:
#include <iostream>
#include <algorithm>
#include <string.h> //memset所在头文件
//此处使用万能头也ok(题主用的VS2022,不能使用万能头qvq)
using namespace std;
int t;
int n, m;
int a[10][10]; //输入的矩阵的数
int vis[10][10] ; //标记该数是否被使用过
int mx = 0;
void dfs(int i, int j, int sum) {
//i是行,j是列,sum是总和
//从第一个开始搜索,搜索完一行,进入下一行
if (i == n + 1) {
//i==n+1时,证明矩阵搜索完毕,进行比较
mx = max(mx, sum);
return;
}
int ii = i; //ii,jj分别为下一个遍历的数的行和列
int jj = j + 1;
//当jj大于m时,该行搜索完毕,进入下一行
if (jj > m) {
ii++;
jj = 1;
}
//当取该数时
if (vis[i - 1][j] + vis[i-1][j + 1] + vis[i - 1][j - 1] + vis[i][j - 1] + vis[i][j] == 0) {
//判断周围是否有已选择的数,因为是按顺序选择的,a[i][j]之后的数不需要判断
vis[i][j] = 1; //将该数标记为已选择的数
dfs(ii, jj, sum + a[i][j]); //递归
vis[i][j] = 0; //回溯
}
dfs(ii, jj, sum); //未选择a[i][j]时,sum不需要加
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--) {
cin >> n >> m;
//因为有多组数据,对mx,数组a,vis进行初始化
mx = 0;
memset(a, '\0', sizeof(a));
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
dfs(1, 1, 0); //从矩阵第一个数进行搜索
cout << mx << endl;
}
}