12 条题解

  • 1
    @ 2024-4-12 12:23:47
    using namespace std;
    int main(){
    	int n;
    	cin>>n;
    	int a[1010];
    	for(int i=1; i<=n; i++){
    		a[i]=i;
    	}
    	do{
    		for(int i=1; i<n; i++){
    			printf("%d ",a[i]);
    		}
    		printf("%d\n",a[n]);
    	}while(next_permutation(a+1,a+n+1));//直接用内置的全排列函数写就行了,注意先输出已有的第一中排列,所以要用do-while
    	return 0;
    }
    
    • 0
      @ 2025-4-5 21:56:55
      #include<bits/stdc++.h>
      using namespace std;
      
      int main() {
          int n;
          cin >> n;
          vector<int> v;
          for(int i=1;i<=n;i++){
              v.push_back(i);
          }
          do{
              for(int num :v){
                  cout << num << " ";
              }
              cout << endl;
          }while(next_permutation(v.begin(),v.end()));
      }
      
      • 0
        @ 2025-3-15 13:20:06
        /*
        #include <iostream>
        #include <vector>
        using namespace std;
        
        // 递归函数,用于生成全排列
        void permute(vector<int>& nums, size_t start, vector<vector<int>>& result) {
            if (start == nums.size() - 1) { //递归终止条件
                result.push_back(nums);  // 将当前排列加入结果
            } else {
                for (size_t i = start; i < nums.size(); i++) { //从start位置开始遍历
                    //核心代码 ===》靠近终止条件 ==》 start+1 代表上一个位置被固定 
                    //那start == nums.size() - 1 代表已经到最终位置了
                    swap(nums[start], nums[i]);  // 交换元素使得每一个元素都在start位置试试
                    permute(nums, start + 1, result);  // 递归生成排列
                    swap(nums[start], nums[i]);  // 恢复原状
                }
            }
        }
        
        int main() {
            int n;
            cin >> n;
        
            vector<int> nums(n);
            for (int i = 0; i < n; i++) {
                nums[i] = i + 1;  // 初始化数组
            }
        
            vector<vector<int>> result;  // 存储所有排列
            permute(nums, 0, result);  // 生成全排列
        
            // 输出所有排列
            for (const vector<int>& perm : result) {
                for (int num : perm) {
                    cout << num << " ";
                }
                cout << endl;
            }
        
            for ( size_t i = 0; i < result.size(); i++ ) {
                for ( size_t j = 0; j < result[i].size(); j++ ) {
                    cout << result[i][j] << " ";
                }
                if(i != result.size() - 1)
                cout << endl;
            }
        
            return 0;
        }
        */
        #include <iostream>
        #include <vector>
        #include <algorithm>
        using namespace std;
        
        int main() {
            int n;
            cin >> n;
        
            vector<int> nums(n);
            for (int i = 0; i < n; i++) {
                nums[i] = i + 1;  // 初始化数组
            }
        
            // 使用 std::next_permutation 生成所有排列
            //next_permutation 的作用是将一个序列(如数组或向量)重新排列,使其成为字典序中的下一个排列。
            //如果当前序列已经是字典序中的最大排列(例如 321),那么它会将序列重置为最小排列(例如 123)。
            do {
                for (int num : nums) {
                    cout << num << " ";
                }
                cout << endl;
            } while (next_permutation(nums.begin(), nums.end()));
        
            return 0;
        }
        
        
        • 0
          @ 2025-3-11 15:32:12
          #include <iostream>
          #include <algorithm>
          
          using namespace std;
          
          int main() {
              int n;
              cin >> n;
          
              int a[1000];
          
              for (int i = 0; i < n; i++) {
                  a[i] = i + 1;
              }
          
              do {
          		for (int i = 0; i < n; i++) {
          			cout << a[i];
                      if (i != n - 1) {
                          cout << " ";
                      }
          		}
          		cout << endl;
          	} while (next_permutation(a, a + n));
          
              return 0;
          }
          
          • 0
            @ 2025-1-7 23:58:48
            // https://dashoj.com/p/82
            #include <bits/stdc++.h>
            
            using namespace std;
            const int N = 15;
            int n, cnt = 0;
            bool nb[N];
            vector<int> cl;
            
            void out() {
            	for (int i = 0; i < cl.size(); i++) {
            		cout << cl[i] << ' ';
            	}
            	cout << endl;
            }
            
            void dfs(int x, int c) {
            	if (cl.size() == n) {
            		out();
            		return;
            	}
            	for (int i = 1; i <= n; i++) {
            		if (nb[i]) {
            			nb[i] = false;
            			cl.push_back(i);
            			dfs(i, c + 1);
            			cl.pop_back();
            			nb[i] = true;
            		}
            
            	}
            }
            
            int main() {
            	fill(&nb[0], &nb[0] + N, true);
            	cin >> n;
            	for (int i = 1; i <= n; i++) {
            		nb[i] = false;
            		cl.push_back(i);
            		dfs(i, 1);
            		cl.pop_back();
            		nb[i] = true;
            	}
            	return 0;
            }
            
            
            • 0
              @ 2024-4-11 13:45:11

              #include<bits/stdc++.h> using namespace std;

              int num[10],str[10]; int ans=0; void dfs(int n,int n2){

              for(int i=1;i<=n2;i++) { if(str[i]!=0) continue; str[i] =1; num[n]=i; dfs(n+1,n2); str[i]=0; }

              if(n==n2) { for(int i=1;i<=n2;i++) { cout<<num[i]<<' '; } cout<<endl; }

              } int main() { int n2; cin>>n2; dfs(1,n2); return 0; }

              • 0
                @ 2024-4-10 21:13:30
                #include <bits/stdc++.h>
                using namespace std;
                int n = 0;
                vector<int> v;
                
                int main(){
                	cin >> n;
                	for(int i = 1 ; i <= n ; i++){
                		v.push_back(i);
                	}
                	
                	do{
                		for(int i = 0 ; i <n ; i++){
                			cout << v[i] << " ";
                		}
                		cout << endl;	
                	}	while(next_permutation(v.begin(), v.end()));
                		
                	return 0;
                }
                
                • 0
                  @ 2024-4-10 16:12:53
                  #include<iostream>
                  #include<algorithm>
                  #include<cmath>
                  #include<cstdio>
                  #include<vector>
                  using namespace std;
                  const int N=12;
                  int used[N];
                  int nums[N];
                  vector<int> res;
                  int n;
                  void dfs(int countNum){
                  	if(countNum>n){
                  		for(auto temp:res) cout<<temp<<" ";
                  		cout<<endl;
                  		return;
                  	}
                  	for(int i=0;i<n;i++){
                  		if(used[i]) continue;
                  //		标记为被使用过
                  		used[i]=1;
                  		res.push_back(nums[i]);
                  		dfs(countNum+1);
                  		used[i]=0;
                  		res.pop_back();
                  	}
                  }
                  int main(){
                  
                  	cin>>n;
                  	for(int i=0;i<n;i++) nums[i]=i+1;
                  	dfs(1);
                  	
                  	return 0;
                  }
                  
                  • 0
                    @ 2024-4-8 21:00:50

                    提供两种解法:

                    next_permutation

                    #include <bits/stdc++.h>
                    using namespace std;
                    const int N = 20;
                    int a[N];
                    int n;
                    int main(){
                        scanf("%d",&n);
                        for (int i = 1; i <= n; ++i) {
                            a[i] = i;
                        }
                        do{
                            for (int i = 1; i <= n; ++i) {
                                printf("%d ",a[i]);
                            }
                            printf("\n");
                        }while(next_permutation(a + 1,a + n + 1));
                        return 0;
                    }
                    

                    DFS

                    #include <bits/stdc++.h>
                    using namespace std;
                    const int N = 20;
                    int vis[N];
                    int a[N];
                    int n;
                    void dfs(int x){
                        if (x > n) {
                            for (int i = 1; i <= n; ++i) {
                                printf("%d ",a[i]);
                            }
                            printf("\n");
                        }
                        for (int i = 1; i <= n; ++i) {
                            if(!vis[i]) {
                                vis[i] = 1;
                                a[x] = i;
                                dfs(x + 1);
                                a[x] = 0;
                                vis[i] = 0;
                            }
                        }
                    }
                    int main(){
                        scanf("%d",&n);
                        dfs(1);
                        return 0;
                    }
                    
                    • 0
                      @ 2024-4-7 21:50:43
                      n = int(input())
                      nums = [i for i in range(1,n+1)]
                      res = []
                      path = []
                      used = [0]*n
                      def dfs(nums,path,used,n):
                          if len(path) == n:
                              print(*path)
                      
                          for i in range(n):
                              if used[i]:
                                  continue
                              used[i] = 1
                              path.append(nums[i])
                              dfs(nums,path,used,n)
                              path.pop()
                              used[i] = 0
                      
                      dfs(nums,path,used,n)
                      
                      • 0
                        @ 2024-4-6 23:13:11

                        #include <bits/stdc++.h> using namespace std; int a[20], x, n;

                        int b[20];

                        void dfs(int x) { if (x > n) { for (int i = 1; i < n; i++) cout << a[i] << " "; cout << a[n] << endl; return; } for (int i = 1; i <= n ; i++) {

                        	if (b[i] == 0) {
                        		b[i] = 1;
                        		a[x] = i;
                        		dfs(x + 1);
                        		b[i] = 0;
                        	}
                        }
                        

                        }

                        int main() { cin >> n; dfs(1); return 0; }

                        • 0
                          @ 2024-4-5 22:42:38
                          #include <cstdio>
                          #include <vector>
                          #include <functional>
                          
                          using namespace std;
                          
                          int main() {
                          	int n;
                          	scanf("%d", &n);
                          	
                          	vector<char> ita(n + 1, 0);
                          	vector<int> res;
                          	function<void()> dfs = [&]() {
                          		if (res.size() >= n) {
                          			for (int& it : res)
                          				printf("%d ", it);
                          			printf("\n");
                          			return;
                          		}
                          		
                          		for (int i = 1; i <= n; ++i) {
                          			if (!ita[i]) { // 是否已经放过
                          				ita[i] = 1;
                          				res.push_back(i); // 放
                          				dfs();
                          				res.pop_back(); // 不放
                          				ita[i] = 0;
                          			}
                          		}
                          	};
                          	
                          	dfs();
                          	
                          	return 0;
                          }
                          
                          • 1

                          信息

                          ID
                          82
                          时间
                          2000ms
                          内存
                          512MiB
                          难度
                          5
                          标签
                          递交数
                          728
                          已通过
                          293
                          上传者