时隔大半年再回头做当初a不掉的dfs水题,十分钟a出来,很开心的哈。
可以用next_pumutation,但是既然练习搜索就手动写出全排列,不然这个题就跟搜索没关系了。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int n,sum;
int a[11];
bool vis[11],flag=false;
bool judge();
void dfs(int num,int len)
{
if(flag==true)
return ;
vis[num]=true;
a[len]=num;
if(len==n)
{
if(judge()&&flag==false)
{
for(int i=1; i<=n; i++)
{
cout<<a[i];
if(i!=n)
cout<<' ';
else
cout<<endl;
}
flag=true;
}
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
dfs(i,len+1);
}
vis[num]=false;
}
bool judge()
{
int b[11];
for(int i=1;i<=n;i++)
b[i]=a[i];
for(int i=n; i>0; i--)
{
for(int j=1; j<i; j++)
{
b[j]=b[j]+b[j+1];
}
}
return b[1]==sum;
}
int main()
{
cin>>n>>sum;
memset(a,0,sizeof(a));
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
dfs(i,1);
return 0;
}