【洛谷】P1433 吃奶酪(dfs深搜、剪枝)

题目:https://www.luogu.org/problem/P1433

标签: 深度优先搜索、剪枝

【题解】

直接用深搜会超时,因为题目是求最小距离,所以可以采用最优性剪枝的方法,遇到不是最优解的时候直接结束搜索。

【代码】

#include 
#include 
using namespace std;
int n, f[20];	//f用于标记是否经过
double x[20], y[20];	//分别存储坐标x和y
double ans = 1234567898.0;	//存储结果

double compute(int a, int b)	//求距离
{
	return sqrt((x[a] - x[b])*(x[a] - x[b]) + (y[a] - y[b])*(y[a] - y[b]));
}

void dfs(int d, double len, int step)
{
	if (len > ans)	return;	//剪枝,遇到大于结果ans的结束搜索
	if (step == n) {
		ans = len;	//把更小的结果赋给结果ans
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (!f[i]) {	//判断是否已经经过该点
			f[i] = 1;
			//坑!!不要用++step,影响了之后循环中的step(即局部变量step)
			dfs(i, len + compute(d, i), step + 1);	
			f[i] = 0;	//回溯
		}
	}
}

int main()
{
	scanf("%d", &n);
	x[0] = 0;
	y[0] = 0;
	for (int i = 1; i <= n; i++) 
		scanf("%lf%lf", &x[i], &y[i]);
	dfs(0, 0.0, 0);
	printf("%.2lf", ans);
	return 0;
}

你可能感兴趣的:(#,洛谷,dfs,剪枝)