通用版1.K - next_permutation

本文通过一个具体的C++程序示例介绍了next_permutation函数的使用方法。该函数用于寻找当前排列的下一个字典序排列,适用于回溯算法等问题中。文章提供了一个完整的代码示例并解释了其工作原理。
#include <iostream>
#include <algorithm>
#include <stdio.h>

using namespace std;

int main()
{
    int n,m,i,s[1010];
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=0;i<=n-1;i++)s[i]=i+1;
        int num=1;
        while(next_permutation(s,s+n)){
            num++;
            if(num==m)break;
        }
        printf("%d",s[0]);
        for(i=1;i<=n-1;i++)printf(" %d",s[i]);
        printf("\n");
    }
    return 0;
}

这道题考了next_permutation函数的使用,求的是当前排列的下一个排列,下面是别人的博客,讲了使用方法

http://blog.youkuaiyun.com/ac_gibson/article/details/45308645

--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) File D:\Anaconda\Lib\site-packages\matplotlib\style\core.py:137, in use(style) 136 try: --> 137 style = _rc_params_in_file(style) 138 except OSError as err: File D:\Anaconda\Lib\site-packages\matplotlib\__init__.py:870, in _rc_params_in_file(fname, transform, fail_on_error) 869 rc_temp = {} --> 870 with _open_file_or_url(fname) as fd: 871 try: File D:\Anaconda\Lib\contextlib.py:137, in _GeneratorContextManager.__enter__(self) 136 try: --> 137 return next(self.gen) 138 except StopIteration: File D:\Anaconda\Lib\site-packages\matplotlib\__init__.py:847, in _open_file_or_url(fname) 846 fname = os.path.expanduser(fname) --> 847 with open(fname, encoding='utf-8') as f: 848 yield f FileNotFoundError: [Errno 2] No such file or directory: 'seaborn-whitegrid' The above exception was the direct cause of the following exception: OSError Traceback (most recent call last) Cell In[36], line 287 284 background_color = '#fafafa' # 非常浅的灰色 286 # 设置全局样式 --> 287 plt.style.use('seaborn-whitegrid') 288 plt.rcParams['font.family'] = 'Times New Roman' 289 plt.rcParams['axes.edgecolor'] = '#333333' File D:\Anaconda\Lib\site-packages\matplotlib\style\core.py:139, in use(style) 137 style = _rc_params_in_file(style) 138 except OSError as err: --> 139 raise OSError( 140 f"{style!r} is not a valid package style, path of style " 141 f"file, URL of style file, or library style name (library " 142 f"styles are listed in `style.available`)") from err 143 filtered = {} 144 for k in style: # don't trigger RcParams.__getitem__('backend') OSError: 'seaborn-whitegrid' is not a valid package style, path of style file, URL of style file, or library style name (library styles are listed in `style.available`)
10-15
#include <stdio.h> #include <math.h> int main() { double m[10][10]; int n; scanf("%d", &n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%lf", &m[i][j]); }} for (int p = 0; p < n-1; p++) { if (fabs(m[p][p]) < 1e-10) { printf("0"); return 0; } for (int r = p+1; r < n; r++) { double a = m[r][p] / m[p][p]; for (int c = p; c < n; c++) { m[r][c] -= a * m[p][c]; }}} int d = 1; for (int i = 0; i < n; i++) { d *= (int)round(m[i][i]); } printf("%d", d); return 0; } 修改代码使其符合题意: 题目背景 人心惟危,道心惟微,惟精惟一,允执厥中。——《尚书·虞书·大禹谟》 高等代数课上,我们学习了如何计算行列式 [Math Processing Error] 。现在我们需要写一段代码,计算给定行列式的值。 输入 第一行,一个正整数 n(1≤n≤8) ,表示给定行列式的阶数 接下来 n 行,每行 n 个由一个空格隔开的整数 ai,j(|ai,j|≤10) ,表示行列式第 i 行第 j 列的值。 数据保证正确使用 Hint 提供的遍历全排列进行计算的过程及结果不会超过 int 的表示范围。 输出 一行,一个整数,表示给出的行列式的值。 输入样例 2 1 2 3 4 输出样例 -2 Hint 如果没有学到行列式的计算,那么我们在这里给出行列式的定义。 设 j=(j1,j2,⋯,jn) 为 1 到 n 的一组排列(即这 n 个数各不相同,且均为 1 到 n 之间的正整数);设 τ(j1,j2,⋯,jn) 为 j 中逆序对的数量(若 1≤p<q≤n ,且 jp>jq ,则称 (p,q) 为 j 的一对逆序对)。 则行列式的值为 [Math Processing Error] 为了简化本题代码量,这里给出计算下一个排列的函数。 int next_permutation(int j[], int n) { int l, r; for ( l = n - 1; l > 0 && j[l] > j[l + 1]; l-- ); if ( l == 0 ) return 0; for ( r = n; j[r] < j[l]; r-- ); int tmp = j[l]; j[l] = j[r]; j[r] = tmp; for ( l++, r = n; l < r; l++, r-- ) { tmp = j[l]; j[l] = j[r]; j[r] = tmp; } return 1; } 我们可以通过以下代码遍历 1 到 n 的全排列: int J[10]; for ( int i = 1; i <= n; i++ ) J[i] = i; do { ; // 此时 J[1] 到 J[n] 是 1 到 n 的一个排列。你可以先在这里打印数组,观察它是怎么运行的。 } while ( next_permutation(J, n) ); 当然,你也可以自行选择按行、列展开的递归方法,或者高斯消元法,只要能计算出来即可。
11-07
题目背景 人心惟危,道心惟微,惟精惟一,允执厥中。——《尚书·虞书·大禹谟》 高等代数课上,我们学习了如何计算行列式 ∣∣∣∣∣∣人道惟允心心精执惟惟惟厥危微一中∣∣∣∣∣∣ 。现在我们需要写一段代码,计算给定行列式的值。 输入 第一行,一个正整数 n(1≤n≤8) ,表示给定行列式的阶数 接下来 n 行,每行 n 个由一个空格隔开的整数 ai,j(|ai,j|≤10) ,表示行列式第 i 行第 j 列的值。 数据保证正确使用 Hint 提供的遍历全排列进行计算的过程及结果不会超过 int 的表示范围。 输出 一行,一个整数,表示给出的行列式的值。 输入样例 2 1 2 3 4 输出样例 -2 Hint 如果没有学到行列式的计算,那么我们在这里给出行列式的定义。 设 j=(j1,j2,⋯,jn) 为 1 到 n 的一组排列(即这 n 个数各不相同,且均为 1 到 n 之间的正整数);设 τ(j1,j2,⋯,jn) 为 j 中逆序对的数量(若 1≤p<q≤n ,且 jp>jq ,则称 (p,q) 为 j 的一对逆序对)。 则行列式的值为 ∣∣∣∣∣∣∣a1,1a2,1⋮an,1a1,2a2,2⋮an,2⋯⋯⋮⋯a1,na2,n⋮an,n∣∣∣∣∣∣∣=∑j1j2⋯jn(−1)τ(j1,j2,⋯,jn)∏i=1nai,ji 为了简化本题代码量,这里给出计算下一个排列的函数。 int next_permutation(int j[], int n) { int l, r; for ( l = n - 1; l > 0 && j[l] > j[l + 1]; l-- ); if ( l == 0 ) return 0; for ( r = n; j[r] < j[l]; r-- ); int tmp = j[l]; j[l] = j[r]; j[r] = tmp; for ( l++, r = n; l < r; l++, r-- ) { tmp = j[l]; j[l] = j[r]; j[r] = tmp; } return 1; } 我们可以通过以下代码遍历 1 到 n 的全排列: int J[10]; for ( int i = 1; i <= n; i++ ) J[i] = i; do { ; // 此时 J[1] 到 J[n] 是 1 到 n 的一个排列。你可以先在这里打印数组,观察它是怎么运行的。 } while ( next_permutation(J, n) ); 当然,你也可以自行选择按行、列展开的递归方法,或者高斯消元法,只要能计算出来即可。 Author: Protoss
最新发布
11-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值