acm测二(搜索)

mac2026-01-19  7

题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入输出格式 输入格式:

n(1≤n≤9)

输出格式:

由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。

输入输出样例 输入样例

3 输出样例

1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 #include <bits/stdc++.h> using namespace std; const int N=15; int a[N],vis[N]; int n; void dfs(int cur,int dep){ if(dep==n){ for(int i=0;i<dep;i++){ printf("%5d",a[i]); } printf("\n"); return; } for(int i=1;i<=n;i++){ if(vis[i]) continue; vis[i]=1; a[dep]=i; dfs(i,dep+1); vis[i]=0; } } int main(){ scanf("%d",&n); dfs(0,0); return 0; }

dfs

#include <stdio.h> #include <iostream> using namespace std; int a[101],b[101],n; void print() { int i; for(i=1;i<=n;i++) { cout<<a[i]<<' '; } cout<<endl; } inline void dfs(int i)//现在是第i层,也可以看成是第i个盒子,把数据放到这个盒子里 { int j; if(i==n+1)//如果到达了第n+1层说明已经搜索完成,输出 { print();//输出方案 return;//返回上一层(上一个盒子) } for(j=1;j<=n;j++)//开始放数据 { if(b[j]==0)//这个数可以放(未标记) { a[i]=j;//放这个数 b[j]=1;//标记被放过了 dfs(i+1);//放第i+1个盒子(层) b[j]=0;//返回之前一步,回溯 } } } int main() { ios::sync_with_stdio(false); cin>>n; dfs(1);//开始深搜 return 0; }
最新回复(0)