P1123 c++ dfs 谁来帮我看看dfs结束条件是啥(有注解)
查看原帖
P1123 c++ dfs 谁来帮我看看dfs结束条件是啥(有注解)
632830
Mark_666楼主2023/4/16 20:25
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int dx[4]={0,-1,0,1};//偏移量 
int dy[4]={-1,0,1,0};
int a[N][N];//存数字 
bool b[N][N];//判断数字是否选取 
int T;//总共数据 
int n,m;//每次行,列 
int msum;//最大和 
void into()//初始化 
{
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<N;j++)
		{
			a[i][j]=0;
			b[i][j]=false;
		}
	}
	msum=0;
}
void dfs(int dep,int sum)
{
	msum=max(sum,msum);//每次选取当前最大的和 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(!b[i][j])//判断数字是否选取 
			{	
				bool flag=true;
				for(int ii=0;ii<4;ii++)//判断所选数字周围数字是否选取 
				{
					if(b[dx[ii]+i][dy[ii]+j]==1)
						flag=false;
				}
				if(flag)
				{
					b[i][j]=1;//选取标记 
					sum+=a[i][j];//累加 
					dfs(dep+1,sum);//递归 
					sum-=a[i][j];//回溯 
					b[i][j]=0;
				}
			
			}
		}
	}
	/*主要不知道这种写法dfs怎么结束,其他感觉没啥问题 
	  主要思路就是:一个数组存数字,一个数组记录,每次选取符合题意的数字
	  并标记,接着递归,最后输出*/
}
int main()
{
	cin>>T;
	for(int i=0;i<T;i++)
	{
		into();//初始化 
		cin>>n>>m;
		for(int j=1;j<=n;i++)
		{
			for(int k=1;k<=m;k++)
			{
				cin>>a[j][k];
			}
		}
		dfs(1,0);//枚举 
		cout<<msum<<'\n';//输出 
	}
	return 0;
}
2023/4/16 20:25
加载中...