关于先后判断到达尽头的问题
查看原帖
关于先后判断到达尽头的问题
87583
云锣楼主2021/2/18 23:34

RT,如果在dfs函数里把判断到达终点的if语句部分放在末尾的话就能AC

#include<bits/stdc++.h>
using namespace std;

bool f[21][21];  //联通地图 
int value[21]; //每个洞穴里的地雷数目 
int n;  //洞穴数目 
int path[21];  //记录每次路径
int ans[21];  //更新最终答案 
bool check[21];  //检查某点是否走过 
int maxn;  //记录单路径地雷数的最大值 
int step_record;  //记录每次经过的洞穴总数 






bool judge(int x)  //从x是否还能继续走 
{
	for(int i=1;i<=n;i++)
	{
		if(f[x][i]&&!check[i])  //可以从x走到i 且i未被探索过 
		{
			return true;  //可以继续走 
		}
		
	}
	
	return false; //遍历过所有点之后发现无法继续走
}






int dfs(int position, int count, int sum)
{
	//check[position]=1;
	path[count]=position;
	check[position]=1;
	sum+=value[position];
	 



	
	for(int i=1;i<=n;i++)
	{
		if(f[position][i]&&!check[i])  //找到下一个可以连接的点 且这个点未走到过 
		{
			//check[i]=1;  //把要走的的点标记为已走 
			//path[count]=i;  //路径记录 
			//sum+=value[i];  //地雷数累加 
			dfs(i,count+1,sum);  
			//check[i]=0;
		}
	}
	
	
	check[position]=0;
	
	if(!judge(position))  //道路已探索到尽头 
	{
		if(sum>maxn)
		{
			maxn=sum;   //?
			step_record=count;
			for(int i=1;i<=step_record;i++)
			{
				ans[i]=path[i]; 
			}
			return sum;
		}
		
		return sum;

	}
	
	
	
	return sum;  //?
	
	
}






int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&value[i]);
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			cin>>f[i][j];
		}
	}
	
	maxn=-999;
	for(int i=1;i<=n;i++)
	{
		//check[i]=1;
		path[1]=i;
		maxn=max(maxn,dfs(i,1,0));
		//check[i]=0;
	}
	


	for(int i=1;i<=step_record;i++)
	{
		printf("%d",ans[i]);
		printf(" ");
	}
	
	printf("\n");
	printf("%d",maxn);
	return 0;
 } 

但如果把判断的那部分放到开头就会在第三个点挂掉

#include<bits/stdc++.h>
using namespace std;

bool f[21][21];  //联通地图 
int value[21]; //每个洞穴里的地雷数目 
int n;  //洞穴数目 
int path[21];  //记录每次路径
int ans[21];  //更新最终答案 
bool check[21];  //检查某点是否走过 
int maxn;  //记录单路径地雷数的最大值 
int step_record;  //记录每次经过的洞穴总数 






bool judge(int x)  //从x是否还能继续走 
{
	for(int i=1;i<=n;i++)
	{
		if(f[x][i]&&!check[i])  //可以从x走到i 且i未被探索过 
		{
			return true;  //可以继续走 
		}
		
	}
	
	return false; //遍历过所有点之后发现无法继续走
}






int dfs(int position, int count, int sum)
{
	//check[position]=1;
	path[count]=position;
	check[position]=1;
	sum+=value[position];
	 

   if(!judge(position))  //道路已探索到尽头 
	{
		if(sum>maxn)
		{
			maxn=sum;   //?
			step_record=count;
			for(int i=1;i<=step_record;i++)
			{
				ans[i]=path[i]; 
			}
			return sum;
		}
		
		return sum;

	}


	
	for(int i=1;i<=n;i++)
	{
		if(f[position][i]&&!check[i])  //找到下一个可以连接的点 且这个点未走到过 
		{
			//check[i]=1;  //把要走的的点标记为已走 
			//path[count]=i;  //路径记录 
			//sum+=value[i];  //地雷数累加 
			dfs(i,count+1,sum);  
			//check[i]=0;
		}
	}
	
	
	check[position]=0;
	
	
	
	
	
	return sum;  //?
	
	
}






int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&value[i]);
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			cin>>f[i][j];
		}
	}
	
	maxn=-999;
	for(int i=1;i<=n;i++)
	{
		//check[i]=1;
		path[1]=i;
		maxn=max(maxn,dfs(i,1,0));
		//check[i]=0;
	}
	


	for(int i=1;i<=step_record;i++)
	{
		printf("%d",ans[i]);
		printf(" ");
	}
	
	printf("\n");
	printf("%d",maxn);
	return 0;
 } 

求助一下各位这是为什么呢

2021/2/18 23:34
加载中...