Description
小X学习了dfs,为了练习搜索,开始给自己出题玩。
玩着玩着,一会把自己难住了,一会又被自己难倒了,真是有趣诶!
小X出的题:
现在有N个不同的正整数,求它们可以组成多少个这样的集合,满足:
- 集合内的元素数量S>1
- 集合内任意两个数的差的绝对值都大于集合内的元素数量。
Input
第一行,一个正整数T(T<=20)表示数据组数。
对于每组数据,有两行。第一行为一个正整数N(3≤N≤25),第二行为N个用空格隔开的正整数xi(xi≤200)。
Output
对于每组数据,输出一行一个整数表示题中所描述的集合的个数。
Sample Input
1 5 2 3 5 8 1
Sample Output
6
Hint
{5,8},{1,5},{1,8},{2,5},{2,8},{3,8}.
思路:
对每个数依次dfs搜索,加入下一个数时查看是否满足题意
#include<cstdio>
#include<algorithm>
using std::sort;
int A[30];
int cnt = 0;
int N;
//上次的数组元素下标,长度,间隔的最小值
void dfs(int index, int length, int smallest)
{
if (index >= N - 1)
return;
for (int i = index + 1; i < N; i++)
{
if (A[i] - A[index] > length + 1)
{
int u = smallest > A[i] - A[index] ? A[i] - A[index] : smallest;
if (u > length + 1)
{
//printf("index = %d, i = %d, length = %d, smallest = %d\n", index, i, length, u);
dfs(i, length + 1, u);
cnt++;
}
}
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &A[i]);
sort(A, A + N);
for (int i = 0; i < N; i++)
dfs(i, 1, 10000);
printf("%d\n", cnt);
cnt = 0;
}
return 0;
}