全排列 DFS实现

/* DFS实现全排列 递归是我的弱项 分析递归过程分析的头都大了。。。 做一下注释 免得日后想不起来 运行时注意: 输入数字最好不要超过两位数 输入10时运行时间近1min 产生的output.txt达到惊人的79.6M!!! */ #define LOCAL #include<iostream> #define N 15 using namespace std; int n,ans[N],visit[N]; void DFS(int depth) { int i,j; for(i=1;i<=n;i++)//从1到n对数表扫描一遍 { if(!visit[i])//看哪个数字未被访问就访问之 { visit[i]=1;//标记为已访问 ans[depth]=i;//将该数字填表 if(depth<n)//如果没有填到n DFS(depth+1);//填depth+1 else//如果填表完毕 { for(j=1;j<=n;j++)//输出结果 cout<<ans[j]<<" "; cout<<endl; } visit[i]=0;//访问完毕返回标记为可访问 //注意这一句只有当填表完毕输出了结果后才有可能执行到 //填表完毕表示一个排列已经产生 //该数自然可以恢复自由身继续被访问了 } } } int main() { #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif while(cin>>n) { memset(visit,0,sizeof(visit)); DFS(1);//从1开始往后填表 } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值