8 条题解

  • 3
    @ 2023-3-3 11:48:30
    #include <bits/stdc++.h>
    using namespace std;
    int a[10], b[10], n, nums[10];
    void dfs (int step)
    {
        if (step == n + 1)
        {
            for (int i = 1; i <= n; i++)
                cout << a[i] << " ";
            cout << endl;
            return;
        }
        for (int i = 1; i <= n; i++)
            if (b[nums[i]] == 0)
            {
                a[step] = nums[i];
                b[nums[i]] = 1;
                dfs(step + 1);
                b[nums[i]] = 0;
            }
        return;
    }
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> nums[i];
        sort(nums + 1, nums + n + 1);
        dfs(1);
        return 0;
    } //已AC
    
    • 2
      @ 2024-6-2 12:44:37

      巨长的代码

      #include <bits/stdc++.h>
      using std::cin;
      using std::cout;
      using std::endl;
      using std::next_permutation;
      using std::sort;
      using ll = long long;
      int n, a[15];
      namespace sub1
      {
          int num[15];
          bool vis[10];
          void dfs(int u)
          {
              if (u > n)
              {
                  for (int i = 1; i <= n; i++)
                      cout << num[i] << " ";
                  cout << endl;
                  return ;
              }
              for (int i = 1; i <= n; i++)
              {
                  if (!vis[a[i]])
                  {
                      vis[a[i]] = 1;
                      num[u] = a[i];
                      dfs(u + 1);
                      vis[a[i]] = 0;
                  }
              }
          }
          void main()
          {
              
              dfs(1);
          }
      }
      namespace sub2
      {
          void main()
          {
              do
              {
                  for (int i = 1; i <= n; i++)
                      cout << a[i] << " ";
                  cout << endl;
              }while (next_permutation(a + 1, a + n + 1));
          }
      }
      int main()
      {
          cin >> n;
          for (int i = 1; i <= n; i++)
              cin >> a[i];
          sort (a + 1, a + n + 1);
          if (n <= 5)
              sub1::main();
          else
              sub2::main();
          return 0;
      }
      
      • 2
        @ 2023-9-2 15:54:04

        题解:

        这道题要求生成给定数字的全排列,并按照字典序从小到大的顺序输出。我们可以使用回溯法来解决这个问题。

        首先,我们需要读入输入的数字,并存储在一个向量中。然后,我们定义一个辅助函数 permute,该函数用于生成全排列。

        permute 函数内部,我们需要有一个循环来遍历所有的可能位置。对于每个位置,我们将待选数字与当前位置交换,然后递归地生成剩下数字的全排列。接着,我们再将数字交换回来,以便进行下一次循环。

        当我们递归到达最后一个位置时,即所有数字都已确定,我们就得到了一个完整的排列。我们可以将这个排列输出。

        以下是不包含完整代码的伪代码实现:

        #include <iostream>
        #include <vector>
        #include <algorithm>
        
        using namespace std;
        
        void permute(vector<int>& nums, int start) {
            if (start == nums.size() - 1) {
                // 输出当前排列
                for (int i = 0; i < nums.size(); i++) {
                    cout << nums[i] << " ";
                }
                cout << endl;
                return;
            }
        
            for (int i = start; i < nums.size(); i++) {
                swap(nums[start], nums[i]);  // 将待选数字与当前位置交换
        
                // 递归生成剩下数字的全排列
                permute(nums, start + 1);
        
                swap(nums[start], nums[i]);  // 恢复原始位置,以便进行下一次循环
            }
        }
        
        int main() {
            int n;
            cin >> n;
        
            vector<int> nums(n);
            for (int i = 0; i < n; i++) {
                cin >> nums[i];
            }
        
            sort(nums.begin(), nums.end());  // 对输入的数字进行排序
        
            permute(nums, 0);  // 从第一个位置开始生成全排列
        
            return 0;
        }
        

        这是一个基于回溯法的全排列生成算法。它通过交换数字的方式来生成排列,同时利用递归实现了穷举所有可能。在每次递归调用时,我们处理一个更小规模的问题,直到达到结束条件。

        上述代码只提供了核心思路和伪代码实现,并未给出完整的可运行代码。你可以参考这个思路来编写自己的代码,并验证输出结果是否按照要求生成。

        • 1
          @ 2023-3-18 8:24:39

          众所周知,STL库中有一个叫 next_permutation 的东西,它可以求出下一个排列

          #pragma GCC optmize(2)
          #include<bits/stdc++.h>
          using namespace std;
          int n,a[114514];
          signed main(){
          	ios::sync_with_stdio(false);
          	cin.tie(0);
          	cout.tie(0);
          	cin >> n;
          	for(int i = 1;i <= n;i++)cin >> a[i];
          	sort(a + 1,a + n + 1);
          	do{
          		for(int i = 1;i <= n;i++)cout << a[i] << " ";
          		cout << endl;
          	}while(next_permutation(a + 1,a + n + 1));
          }
          
          • 0
            @ 2024-2-4 20:19:17

            算法复杂度惊掉下巴的-----------O(n!)!!!!!!!!

            初学者必看

            /*
            主要函数:sort(起始地址,终止地址)参数为该数组(字符串)的地址,默认从小到大排序,用的是快速排序
                     next_permutation(起始地址,终止地址)参数为该数组(字符串)的地址,返回值为布尔,可以生成下一个排列
            */
            #include <bits/stdc++.h>
            using namespace std;
            int n,a[10];//n<=8 长度为10即可
            int main(){
                cin>>n;//输入数字个数
                for (int i=1;i<=n;i++)cin>>a[i];//输入要排列的n个数字
                sort(a+1,a+1+n);//按字典序从小到大排序
                do{//用do__while循环才能使while循环多一次循环,刚好能输出第一个排列
                    for (int i=1;i<=n;i++)cout<<a[i]<<" ";//输出排列出的数字,以空格隔开
                    cout<<endl;//endline(endl)换行
                }while(next_permutation(a+1,a+1+n));//获取全排列,具体见--主要函数
                return 0;
            }
            

            AC code

            #include <bits/stdc++.h>
            using namespace std;
            int n,a[10];
            int main(){
                cin>>n;
                for (int i=1;i<=n;i++)cin>>a[i];
                sort(a+1,a+1+n);
                do{
                    for (int i=1;i<=n;i++)cout<<a[i]<<" ";
                    cout<<endl;
                }while(next_permutation(a+1,a+1+n));
                return 0;
            }
            
            • -1
              @ 2023-3-30 19:11:41

              #include<bits/stdc++.h> using namespace std; bool book[17]; int a[17],n,x[17]; void dfs(int d) { if (d==0) { for (int i=n;i>0;i--) cout<<a[i]<<" "; cout<<'\n'; return; } for (int i=1;i<=n;i++) if (!book[i]) { a[d]=x[i]; book[i]=1; dfs(d-1); book[i]=0; } } int main() { cin>>n; for (int i=1;i<=n;i++) cin>>x[i]; sort(x+1,x+n+1);//这里记得要排序 dfs(n); return 0; }

              • -1
                @ 2023-1-9 12:43:33

                这题输出太多,用printf就行了

                • -2
                  @ 2022-4-24 17:47:35

                  写题解请注意

                  鼓励大家写题解,但注意题解格式。

                  题解一定要有思路解析或代码注释,能否让别人理解你的思路

                  也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

                  给代码两端加上这个会舒服一些

                  ```cpp

                  你的代码

                  ```

                  </span>

                  这个点在键盘的左上角tab上面那个键,注意切换输入法

                  #include<iostream>
                  using namespace std;
                  int main()
                  {
                      int n;
                      cin>>n;//这是一个注释
                      return 0;
                  } 
                  

                  请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                  抄袭题解一经发现直接取消成绩。

                  题解被删除的可能

                  1. 代码不符合格式规范
                  2. 没有思路讲解或者没有注释,
                  3. 无意义的题解

                  大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

                  • 1

                  信息

                  ID
                  682
                  时间
                  1000ms
                  内存
                  32MiB
                  难度
                  4
                  标签
                  递交数
                  221
                  已通过
                  107
                  上传者