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 }