LG-P1135 奇怪的电梯

P1135 奇怪的电梯 传送门

暴搜,dfs。

普及,提高 -。

话说下一次再碰到暴搜就用 bfs 写。

细节 / bug

  1. 要开 vis 数组——判断走没走过,减少次数;

  2. 每次回溯的时候清空 vis(两种都可以,见代码);

  3. ans 初始值设成 1e7 (反正够大就行了),千万不要设 0x7f ,这个小到定义 int 就只有 127;

  4. 要在中间判断 cnt(递归传递的变量)是否已经大于等于 ans(还没到达目标状态),是的话,直接返回,减少次数、缩短时间。

注释掉的是一种赋值 vis 的方法,没有注释掉的是另一种方法。

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

#define int long long
const int maxn = 405;
int n, a, b;
int k[maxn], vis[maxn];
int ans, fla;
int sum;

int read ()
{
	int x = 1, s = 0;
	char ch = getchar ();
	while (ch < '0' or ch > '9'){
		if (ch == '-') x = -1;
		ch = getchar ();
	}
	while (ch >= '0' and ch <= '9'){
		s = s * 10 + ch - '0';
		ch = getchar ();
	}
	return x * s;
}

void dfs (int s, int t, int cnt)
{
	if (s == t)
	{
		fla = 1;
		ans = min (ans, cnt);
		return;
	}
	if (cnt >= ans) return;
	int de = k[s];
//	vis[s] = 1;
	if ((s - de) >= 1 and !vis[s - de]) 
	{
		vis[s - de] = 1;
		dfs (s - de, t, cnt + 1);
		vis[s - de] = 0;
	}
	if ((s + de) <= n and !vis[s + de])
	{
		vis[s + de] = 1;
		dfs (s + de, t, cnt + 1);
		vis[s + de] = 0;
	} 
//	vis[s] = 0;
}

signed main ()
{
	ans = 1e7;
	n = read (), a = read (), b = read ();
	for (int i = 1; i <= n; i++) k[i] = read ();
	dfs (a, b, 0);
	if (ans == 1e7) printf ("-1\n");
	else printf ("%lld\n", ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值