在看那道Bronze-2022Feb-Blocks_xy404chef的博客-CSDN博客
找到的参考资料,这对我来说是个盲点,搬运这个基础知识点到这个分类下来。
输入:3
输出:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
先定义两个数组,一个是用来存放解的,一个是用来标记该数是否用过。
我们可以先写一个用于打印的函数print(),每当深搜时找到一个符合条件的解时,则print()一下,
#include<bits/stdc++.h>
using namespace std;
int n;
int used[10];
int num[10];
void print()//输出函数
{
int i;
for(i=1;i<=n;i++)
printf("%5d",used[i]);//
cout<<endl;
}
void dfs(int k)//
{
int i;
if(k==n) //when search till k==n,that means all number searched
{
print();
return;
}
for(i=1;i<=n;i++)//
{
if(!num[i])//
{
num[i]=1;//tag the number
used[k+1]=i;//fill the number into basket
dfs(k+1);//write next num
num[i]=0;//when write next num in dfs, tag the number to original state for next time
}
}
}
int main(){
cin>>n;
dfs(0);
return 0;
}
另一种用next_permutation
int a[10];
int main()
{
int n,i,j=1,k;
cin>>n;
for(i=1;i<=n;i++)
{a[i]=n-i+1;j*=i;}//题目好像没说要从小到大输出
//但保险起见还是初始赋值为最大序列
//即a[1~n]=n~1;顺便计算n!
for(i=1;i<=j;i++)
{next_permutation(a+1,a+n+1);
for(k=1;k<=n;k++)
cout<<" "<<a[k];//排一次输出一次
//空格建议复制
cout<<endl;
}
return 0;
}