8 条题解
-
3
#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
巨长的代码
#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
题解:
这道题要求生成给定数字的全排列,并按照字典序从小到大的顺序输出。我们可以使用回溯法来解决这个问题。
首先,我们需要读入输入的数字,并存储在一个向量中。然后,我们定义一个辅助函数
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
众所周知,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
算法复杂度惊掉下巴的-----------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
#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; }
-
-2
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 682
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 4
- 标签
- 递交数
- 228
- 已通过
- 109
- 上传者