3 条题解

  • 1
    @ 2023-10-14 9:54:14
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int ans[10];
    int arr[10];
    int myn;
    void dfs(int mx){
    	if(mx == myn+1){
    		for(int i=1;i<=myn;i++){
    			printf("%5d",ans[i]);
    		}
    		cout << '\n';
    		return;
    	}else{
    		for(int i=1;i<=myn;i++){
    			if(arr[i]==1){
    				continue;
    			}
    			if(arr[i] == 0){
    				ans[mx] = i;
    				arr[i] = 1;
    				dfs(mx+1);
    				arr[i] = 0;
    			}
    		}
    	}
    	return;
    }
    int main(){
    	cin >> myn;
    	dfs(1);
    	return 0;
    }
    
    • 1
      @ 2023-4-11 13:59:11

      深搜

      # include <bits/stdc++.h>
      using namespace std;
      int n;
      int stu[15], ret[15];
      void dfs(int k) {
      	if (k > n) {
      		for (int i = 1; i <= n; i++) {
      			printf("%5d", ret[i]);
      		}
      		printf("\n");
      	}
      	for (int i = 1; i <= n; i++) {
      		if (stu[i] == 0) {
      			stu[i] = 1;
      			ret[k] = i;
      			dfs(k + 1);
      			stu[i] = 0;
      		}
      	}
      }
      int main() {
      	cin >> n;
      	dfs(1);
      	return 0;
      }
      
      • 1
        @ 2022-1-26 11:10:30

        STL 解法

        如果不想自己写搜索,这题也可以用 C++STL 当中的 next_permutation (下一个排列)函数来解决。

        关于 next_permutation 函数的用法,在这里贴一篇文章:文章链接

        这道题重点使用数组的全排列,需要的参数有数组的开始地址和结束地址。

        思路

        首先输入 nn (即数组长度),这里n9n≤9,所以用 int 就行。

        非完整代码

        #include <bits/stdc++.h>
        using namespace std;
        int main(){
        	int n;
        	cin>>n;
            return 0;
        }
        

        然后定义一个从1到nn的数组,方便之后调用全排列函数,并对数组初始化。

        #include <bits/stdc++.h>
        using namespace std;
        int main(){
        	int n;
        	cin>>n;
        	int a[n];
        	for(int i=0;i<n;i++){
        		a[i]=i+1;
        	}
        	return 0;
        }
        

        这里如果循环变量 I 是从0开始的,一定要将 a[i] 赋值为 i+1 ,因为序列中不包括0 。

        接着就循环输出

        #include <bits/stdc++.h>
        using namespace std;
        int main(){
        	int n;
        	cin>>n;
        	int a[n];
        	for(int i=0;i<n;i++){
        		a[i]=i+1;
        	}
        	do{
        		for(int i=0;i<n;i++){
        			printf("%5d",a[i]);
        		}
        		cout<<endl;
        	}while(next_permutation(a,a+n));
        	return 0;
        }
        

        这里 do{}while() 循环的意义是将原先数组先输出一遍,因为在题目中这也是一种排列。

        next_permutation 函数将对a数组自动进行全排列,并返回:

        • ture表示仍有其他可用排列。
        • false表示无其他可用排列。

        也就是说,当没有其他排列方法时,循环便会自动结束。

        大功告成!

        AC代码(请勿抄袭):

        #include <bits/stdc++.h>
        using namespace std;
        int main(){
        	int n;
        	cin>>n;
        	int a[n];
        	for(int i=0;i<n;i++){
        		a[i]=i+1;
        	}
        	do{
        		for(int i=0;i<n;i++){
        			printf("%5d",a[i]);
        		}
        		cout<<endl;
        	}while(next_permutation(a,a+n));
        	return 0;
        }
        
        • 1

        信息

        ID
        680
        时间
        1000ms
        内存
        125MiB
        难度
        2
        标签
        递交数
        40
        已通过
        19
        上传者