传送门
思路
一道超级简单的入门搜索题!随便做都可以过的那种(反正我是乱做的。。)
先用一个数组把之前就有的旅馆存下来,然后输入新旅馆的时候从第\(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 << '\n'; return 0; }