#include<stdio.h>
#include<stdlib.h>
int s[11],N,M,vis[11];
int num[11][11];
void dfs(int co)
{
int i,j;if(co==N+1)
{
for(i=0;i<N;i++) //初始第一行
{
num[1][i]=s[i+1];
// printf("%d ",num[1][i]);
}
for(i=2;i<=N;i++) //然后按照每一层的数等于上一层临近2个数的和,来计算每一层的数
for(j=0;j<=N-i;j++)
{
num[i][j]=num[i-1][j]+num[i-1][j+1];
}
if(num[N][0]==M) //num[N][0]就是最后一行唯一数
{
for(i=1;i<=N;i++)
printf("%d ",s[i]);
printf("\n");
exit(0) ; //直接结束进程!不要用return ,这会继续递归排列,直到完成,会超时,
}
}
for(i=1;i<=N;i++) //全排列
{
if(!vis[i])
{
s[co]=i;
vis[i]=1; //vis[i]用来标记i是否用过
dfs(co+1);
vis[i]=0;
}
}
return ;
}
int main(void)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&N,&M);
dfs(1);
}
poj 3187
最新推荐文章于 2022-04-11 15:15:31 发布