sicily 1373. Cows Of The Round Ta

#include<iostream>
#include
<cstdlib>
using namespace std;
int n,k,num[20],seq[20],vis[20],s;
void search(int id)
{
if(id==n)
s
++;
else
{
for(int i=0;i<n;++i)
if(vis[i]==0&&abs(num[i]-seq[id-1])<=k)
{
if(id==n-1&&abs(num[i]-seq[0])>k)
continue;
seq[id]
=num[i];
vis[i]
=1;
search(id
+1);
vis[i]
=0;
}
}
}
int main()
{
cin
>>n>>k;
for(int i=0;i<n;++i)
cin
>>num[i];
seq[
0]=num[0];
vis[
0]=1;
search(
1);
cout
<<s<<endl;
return 0;
}


/*

样例中:
4 10
2 16 6 10

如果以 2 作为序列的开头, 有两种可能组合: 2 6 16 10 和 2 10 16 6
如果把 2 6 16 10 看作一环,得到 2 6 16 10 2 6 16 10 ,
可以看出,2 6 16 10 其实是和 6 16 10 2 , 16 10 2 6 , 10 2 6 16 一样的.

同样地,如果把 2 10 16 6 看作一环,得到 2 10 16 6 2 10 16 6 ,
可以看出,2 10 16 6 其实是和 10 16 6 2 , 16 6 2 10 , 6 2 10 16 一样的.

所以序列的第一个元素是什么并没有影响,你同样可以把6 作为第一个元素, 也有两种组合:
6 16 10 2 (与 2 6 16 10 相同) 6 2 10 16 (与 2 10 16 6 相同)
但第一个元素确定下来后就不能再更改了,因为更改第一个元素后形成的序列实质上还是一样的组合


另外,看另一个例子
4 10
2 6 6

答案应该是 2 ,
要注意,在该题中,即使元素值相等,也是分属于两个元素(两头牛身高一样,但还是两头牛,并不因身高相同而变成一头牛)
于是我们应该把 2 6 6 看作 2 6(1) 6(2) , 其中 6(1),6(2) 表示身高都为6的两头牛
所以有两种以 2 开头的可能组合 : 2 6(1) 6(2) 和 2 6(2) 6(1) 故答案是 2

*/

  

posted on 2011-07-23 15:37  sysu_mjc  阅读(190)  评论(0)    收藏  举报

导航