3 solutions

  • 2
    @ 2021-10-21 19:04:08

    背景

    本题求的是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