本来想写一B+树,翻到一个帖子里面去了点击打开链接 看到了里面第六个问题
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..
正好昨天写了个数独的求解,这两个问题都差不多,都是靠DFS,并且靠前面的数据来进行状态空间的压缩,找到这个压缩的条件是关键。
数独的压缩条件就是游戏规则,这个的压缩条件
我找出来的是如果前面填了N个数,则后面就不能填大于10-N的数了。
PS:就是个DFS+剪枝....现在看来真是毫无技术含量啊
#include<iostream>
using namespace std;
int num[10];
int p[10];
bool check(int x)
{
int i,j,k;
int count=0;
for(i=0;i<10;i++)
{
if(p[i]==num[x])
count++;
}
if(count>p[x])
return false;
return true;
}
void success()
{
int i,j;
for(i=0;i<10;i++)
if(p[i]==-1)
return;
int count;
for(i=0;i<10;i++)
{
count=0;
for(j=0;j<10;j++)
{
if(p[j]==num[i])
count++;
}
if(count!=p[i])
return ;
}
for(i=0;i<10;i++)
cout<<p[i]<<" ";
cout<<endl;
system("pause");
}
void dfs(int x)
{
int i,j,k;
if(x>9)
{
success();
return;
}
for(i=0;i<10-x;i++)//压缩条件
{
p[x]=i;
if(check(x))
{
dfs(x+1);
}
p[x]=-1;
}
}
int main()
{
memset(p,-1,sizeof(p));
int i;
for(i=0;i<10;i++)
num[i]=i;
dfs(0);
}