取数游戏(dfs)

前言:

该题取自洛谷P1123,题主用的dfs(深度优先搜索)

题目描述:

数据范围:

思路:

思路见代码,注释的很清晰嗷

AC代码:

cpp 复制代码
#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;
	}
}
相关推荐
啊罗罗13 小时前
windows下,c++的axv2+fma/avx-vnni加速计算demo
c++·windows·算法
qq_2837200514 小时前
Embedding 调优实战技巧:从原理到落地,打造高精度向量检索
python·算法·词嵌入·调优
li星野14 小时前
滑动窗口五题通关:从最小覆盖子串到水果成篮(Python + C++)
c++·python·学习
Xpower 1714 小时前
OpenClaw近一月版本更替讲解
人工智能·学习·算法
Ulyanov14 小时前
《从质点到位姿:基于Python与PyVista的导弹制导控制全栈仿真》: 刚体觉醒——6-DOF刚体动力学、四元数与全姿态解算
开发语言·人工智能·python·算法·系统仿真·雷达电子对抗仿真
Sylvia33.14 小时前
足球数据API接入实战:从认证到实时比分推送的完整指南
java·开发语言·前端·c++·python
Dillon Dong14 小时前
机侧同步定子电压环的PI整定:从“对齐三个量“到“闭环四步法“
算法·变流器·风电控制·dfig
Languorous.14 小时前
C++数据结构进阶|图(Graph)详解:从存储到面试高频算法实战
算法
时空自由民.14 小时前
C/C++ volatile关键字原理及应用介绍
java·c语言·c++
我头发还没掉光~14 小时前
P4147 玉蟾宫
数据结构·c++·算法