深搜就是撞了南墙才会回头
见了黄河才会死心
它一条路走到黑
例如生成1---n全排列
#include <bits/stdc++.h>
using namespace std;
int n,mark[19]={0},num[19];
void dfs(int step)
{
if(n+1==step)//搜索终止条件
{
for(int i=1;i<=n;i++)
cout<<num[i];
cout<<endl;
return;
}
for(int i=1;i<=n;i++)//第一个数先从1开始,完了之后从2开始
{
if(!mark[i])
{
mark[i]=true;
num[step]=i;//不能num[step++]=i;//要不然就会关系错乱
dfs(step+1);//再搜索下一个数
mark[i]=false;//回溯一步
}
}
return;
}
int main()
{
cin>>n;
dfs(1);
}
当然,用队列做更简单
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p[10]={1,2,3,4,5,6,7,8};
do
{
for(int i=0;i<5;i++)
printf("%d ",p[i]);
printf("\n");
}while(next_permutation(p,p+5));//生成1-5全排列
return 0;
}
//例如生成1-3全排列
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p[10]={1,2,3,4,5,6,7,8,9};
do
{
for(int i=0;i<3;i++)
printf("%d ",p[i]);
printf("\n");
}while(next_permutation(p,p+3));
return 0;
}
再改编一下
如ABC+DEF=GHI形式
用1--9组成的不重复数字组成上述等式的方案个数是多少?
#include <bits/stdc++.h>
using namespace std;
int n,mark[19]= {0},num[19]={0},total=0;
void dfs(int step)
{
if(10==step)
{
if (num[1] * 100 + num[2] * 10 + num[3] //结束条件2,满足等式
+ num[4] * 100 + num[5] * 10 + num[6]
== num[7]*100 + num[8]*10 + num[9])
{
total++;
}
return;
}
for(int i=1; i<=9; i++)
{
if(!mark[i])
{
mark[i]=true;
num[step]=i;//不能num[step++]=i;
dfs(step+1);
mark[i]=false;
}
}
return;
}
int main()
{
//cin>>n;
dfs(1);
cout<<total/2;//因为A+B=B+A重复了一次
}