[洛谷P1822]魔法指纹

题目传送门

这道题事实上解并不多,所以我们倒过来从$7$开始搜索。主过程中为广搜,而函数深搜进行拓展。其实是对于前导$0$删去的情况也要考虑,否则只有$20pts$。

最后别忘了判断$7$在不在$[A,B]$。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define rep(i, a, b) for (register int i = a; i <= b; ++i)
 6 
 7 int A, B, ans, pw[10], dB = 0;
 8 
 9 queue< pair<int, int> > q;
10 
11 void dfs(int v, int s, int dep, int max_dep, int last) {
12     if (dep > dB+1) return;
13     if (dep == max_dep) {
14         if (s <= B && last) {
15             q.push(make_pair(s, dep));
16             if (s >= A) 
17                 ans++;
18         }
19         return;
20     }
21     int bit = v % 10;
22     if (bit+last < 10) dfs(v / 10, s + (bit+last) * pw[dep], dep+1, max_dep, bit+last);
23     if (last-bit >= 0 && bit != 0) dfs(v / 10, s + (last-bit) * pw[dep], dep+1, max_dep, last-bit);
24 }
25 
26 int main() {
27     scanf("%d%d", &A, &B)
28     if (A <= 7 && 7 <= B) ans++;
29     q.push(make_pair(7, 1));
30     pw[0] = 1;
31     rep(i, 1, 9) {
32         pw[i] = pw[i-1] * 10;
33         if (B > pw[i]) dB = i;
34     }
35 
36     while (!q.empty()) {
37         pair<int, int> h = q.front(); q.pop();
38         rep(i, 0, 9)
39             dfs(h.first, i, 1, h.second+1, i);
40         if (h.second <= dB) q.push(make_pair(h.first, h.second+1));
41     }
42 
43     printf("%d", ans);
44     return 0;
45 }

这道题如果要打表也可以,就是表会很大。

posted @ 2019-01-30 21:10  AC-Evil  阅读(217)  评论(0编辑  收藏  举报