题目链接:http://lightoj.com/volume_showproblem.php?problem=1122
Time Limit: 2 second(s) Memory Limit: 32 MB
Problem Description
Given a set of digits S, and an integer n, you have to find how many n-digit integers are there, which contain digits that belong to S and the difference between any two adjacent digits is not more than two.
Input
Input starts with an integer T (≤ 300), denoting the number of test cases.
Each case contains two integers, m (1 ≤ m < 10) and n (1 ≤ n ≤ 10). The next line will contain m integers (from 1 to 9) separated by spaces. These integers form the set S as described above. These integers will be distinct and given in ascending order.
Output
For each case, print the case number and the number of valid n-digit integers in a single line.
Sample Input
3
3 2
1 3 6
3 2
1 2 3
3 3
1 4 6
Output for Sample Input
Case 1: 5
Case 2: 9
Case 3: 9
Note
For the first case the valid integers are
11
13
31
33
66
Problem solving report:
Description: 给你m种数,要求使用这m种数组成n位整数,使得该数的每位和相邻位的数的差不超过2。
Problem solving: 数据较小,直接DFS就行了。
Accepted Code:
/*
* @Author: lzyws739307453
* @Language: C++
*/
#include <bits/stdc++.h>
using namespace std;
int n, m, spt[15];
int DFS(int u, int l) {
if (l >= n)
return 1;
int ans = 0;
for (int i = u - 2; i <= u + 2; i++)
if (i >= 0 && i < m && abs(spt[u] - spt[i]) <= 2)
ans += DFS(i, l + 1);
return ans;
}
int main() {
int t, ans, kase = 0;
scanf("%d", &t);
while (t--) {
ans = 0;
scanf("%d%d", &m, &n);
for (int i = 0; i < m; i++)
scanf("%d", &spt[i]);
for (int i = 0; i < m; i++)
ans += DFS(i, 1);
printf("Case %d: %d\n", ++kase, ans);
}
return 0;
}