洛谷 P1515 旅行
思路
一道超级简单的入门搜索题!随便做都可以过的那种(反正我是乱做的。。)
先用一个数组把之前就有的旅馆存下来,然后输入新旅馆的时候从第(15)个开始输入,之后对旅馆的位置排一下序,直接暴力搜索就行了
具体的可以看注释
代码
//知识点:搜索
/*
By:Loceaner
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() { //快读(不会的话无视掉,输入的时候直接用scanf就好了)
char c = getchar();
int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
}
const int N = 50;
int a, b, n, w[N] = {0, 990, 1010, 1970, 2030, 2940, 3060, 3930, 4060, 4970, 5030, 5990, 6010, 7000}, vis[N], ans = 0; //用w数组存每个旅馆的位置
void dfs(int now, int cnt) {
if(now >= 7000) {//只要目前的位置大于了7000,直接让方案数加一并返回
ans++;
return;
}
for(int i = 1; i <= n + 15; i++) {
if(!vis[i]) {
if(w[i] - now >= a && w[i] - now <= b) {
vis[i] = 1;//如果满足条件就将vis数组设为1
dfs(w[i], cnt + 1);//更新参数,继续搜索
vis[i] = 0;//搜索完之后回溯
}
}
}
}
int main() {
a = read(), b = read(), n = read();
for(int i = 15; i < n + 15; i++) w[i] = read();
stable_sort(w, w + n + 15);//从小到大排序
vis[0] = 1;
dfs(0, 0);
cout << ans << '
';
return 0;
}