什么!?编程作业是写一篇题解,那作为copilot的忠实用户必须要copilot一下辣!!!
作为此生第一篇题解,那必须要体现出我们清奇的思路和勇于打字的优良品质,因此 这道题我选择直接打表。
先看题目:
P1706
# 全排列问题
## 题目描述
按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
## 输入格式
一个整数 n。
## 输出格式
由 n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
## 样例 #1
### 样例输入 #1
```
3
```### 样例输出 #1
```
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
```## 提示
1 <= n <= 9。
很明显,是个递归。 递归是什么?我不知道,作为一个编程小白 我选择打表(bushi) 暴力枚举
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[15];
for(int i=1;i<=9;i++) a[i]=i;
int n;
cin>>n;
for(int i1=1;i1<=n;i1++)//把第一个数从1-n枚举
{...............................................................
你被骗了,这么复杂的循环判断,谁爱写谁写,还是选择——递归!
话不多说 上代码!
#include<bits/stdc++.h>
using namespace std;
int n,a[1005],flag[1005];
void f(int x)
{
if(x>n)
{
for(int i=1;i<=n;i++)
{
cout<<setw(5)<<a[i];//输出要设置场宽 引入一个函数:setw(所需宽度) 头文件是iomanip
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(flag[i]==0) //开始递归
{
flag[i]=1; //flag标记出现过的数字
a[x]=i;
f(x+1); //进入下一层 x++你就写吧 一写一个不吱声 because x++它等于x=x+1直接赋值了
flag[i]=0;
a[x]=0; //清零
}
}
}
int main()
{
cin>>n;
f(1); //传参 从1开始枚举
return 0;
}
此时的gpt4表示:你太逊了
直接展示了一波next_permutation函数 民间叫法:典排列,它可以自动生成下一个字典序的排列,知道没有更多的排列为止。 头文件algorithm。
话不多说 再上代码!
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n; // 输入 n
int a[10]; // 定义数组 a
for (int i = 0; i < n; i++) {
a[i] = i + 1; // 初始化为 1 到 n 的自然数
}
do {
for (int i = 0; i < n; i++) {
printf("%5d", a[i]); // 每个数字保留 5 个场宽
}
printf("\n");
} while (next_permutation(a, a + n)); // 生成下一个排列
return 0;
}
没有任何问题地AC了 玩的就是真实!