Codeforces Round #359 (Div. 2) C. Robbers' watch DFS

C. Robbers' watch

链接:

http://codeforces.com/contest/686/problem/C

题意:

给你n和m,找出(a,b)的对数,其中a满足要求:0<=a<n,a的7进制的位数和n-1的7进制的位数相同,b满足要求:0<=b<m,b的7进制的位数和m-1的7进制的位数相同,且a和b的7进制下的位上的数都不相同,即如果a的七进制数为10,b的7进制数为21,这种情况是不行的,因为重复了1

题解:

先计算n,m各需要多少位(注意7需要1位就够了,而不是两位),枚举每一位的数,一个标记数组就可以了,找完a再找b,注意中间的回溯,找完b检查一下就好了

代码:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int n, m;
 5 int la = 1, lb = 1;
 6 int vis[10];
 7 int ans = 0;
 8 
 9 void dfs2(int k,int num)
10 {
11     if (k == lb) {
12         ans++;
13         return;
14     }
15     for (int i = 0; i <= 6; i++) {
16         if (vis[i] == 0 && num * 7 + i < m) {
17             vis[i] = 1;
18             dfs2(k + 1, num * 7 + i);
19             vis[i] = 0;
20         }
21     }
22 }
23 
24 void dfs1(int k,int num)
25 {
26     if (k == la) {
27         dfs2(0, 0);
28         return;
29     }
30     for (int i = 0; i <= 6; i++) {
31         if (vis[i] == 0 && num * 7 + i < n) {
32             vis[i] = 1;
33             dfs1(k + 1, num * 7 + i);
34             vis[i] = 0;
35         }
36     }
37 }
38 
39 int main()
40 {
41     cin >> n >> m;
42     int fn = n, fm = m;
43     if (n > 0)n--;
44     if (m > 0)m--;
45     while (n / 7) {
46         la++;
47         n /= 7;
48     }
49     while (m / 7) {
50         lb++;
51         m /= 7;
52     }
53     n = fn, m = fm;
54     if (la + lb > 7) {
55         cout << 0 << endl;
56         return 0;
57     }
58     dfs1(0, 0);
59     cout << ans << endl;
60     return 0;
61 }

 

posted @ 2016-09-27 18:59  Flowersea  阅读(304)  评论(0编辑  收藏  举报