3 solutions
-
2
背景
本题求的是1-n的全排列,emm我也不知道为啥会放在新手村,因为这道题需要用到dfs算法。还不知道dfs的同学可以康康这个 https://blog.csdn.net/qq_51536841/article/details/120892489?spm=1001.2014.3001.5501 明白了dfs就很好做了
思路
就是分别把每个数字放在每个位置上,比如n==3时,第一个位置先放1,然后把1标记已经使用,第二个位置就只能放2或3,如果放2,再把2标记,那么第三个位置就只能放3,然后返回第二个位置放3,把2的标记去掉,那么第三个位置就只能放2,再返回到第一个位置,第一个位置放2,把1的标记取消,就可以在后面的位置放1,以此类推。
附上代码
#include<iostream> using namespace std; #define N 10000 int a[N]; int pd[N]={0}; int n; void print(){ for(int i=1;i<=n;i++){ printf("%d ",a[i]); }cout<<"\n"; } void dfs(int x){ if(x==n){ print();//x表示的是当前已经放了几个数了,当n个的时候就可以输出了 return; } for(int i=1;i<=n;i++){ if(!pd[i]){/i未被标记,即可使用 a[x+1]=i;//讲i放再a数组里 pd[i]=1;//标记i表示i被放过了 dfs(x+1);//然后dfs下一个 a[x+1]=0;//此时已经返回当前这个位置了,就表示这个数已经用过了,要换下一个排列了 pd[i]=0;//标记取消让笑一个位置可以用这个数。 } } } int main(){ cin>>n; dfs(0); return 0; }
Information
- ID
- 45
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 324
- Accepted
- 119
- Uploaded By