本文介绍: 假设有从 1 到 n 的 n 个整数。给你一个整数 n ,返回可以构造优美排列 的 数量。Problem P20. [算法回溯]优美的排列perm[i] 能够被 i 整除。i 能够被 perm[i] 整除。1 到 n 的 n 个整数。

Problem P20. [算法回溯]优美的排列
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :

perm[i] 能够被 i 整除
i 能够被 perm[i] 整除
给你一个整数 n ,返回可以构造的 优美排列 的 数量 。

提示

1 &lt;= n <= 15
输入

1 到 n 的 n 个整数

示例 1:

输入:n = 2

输出:2

解释

第 1 个优美的排列是 [1,2]:

第 2 个优美的排列是 [2,1]:

  • perm[1] = 2 能被 i = 1 整除
  • i = 2 能被 perm[2] = 1 整除

输出

优美排列 的 数量

样例

标准输入
2
标准输出
2
标准输入
1
标准输出
1

参考文章

参考视频

在这里插入图片描述

#include <iostream&gt;
#include <bits/stdc++.h&gt;

int cnt = 0;
using namespace std;
/*
used:表示这个数字没有用过
idx:表示位置,从1开始,逐步+1,指向后面的位置
n:表示有多少个数字,1-n个数字进行“优美排列”
*/
void backtrack(vector<bool&gt;&amp; used, int idx, int n)
{
    //递归算法,当idx指向位置超过n时,说明前面位置数字匹配都成功了,‘优美排列’+1
    if(idx &gt; n)
    {
        cnt++;
        return;
    }
    for(int i=1; i<n+1; i++)//进行n次循环,因为从1开始,所以n+1截止
    {
        //没用过的数字进行匹配,数字和位置匹配成功
        if(used[i]==true &amp;&amp; (i%idx==0 || idx%i==0))
        {
            used[i] = false;//匹配成功的数字就表示用过了
            backtrack(used, idx+1, n);//指针指向下一个位置
            used[i] = true;//回溯后的数字要表示没用过
        }
    }
}

int main()
{

    int n;
    cin &gt;&gt; n;
    vector<bool&gt; used = vector<bool&gt;(n+1, true);//bool容器装数字,表示用没用过
    backtrack(used, 1, n);
    cout << cnt;
//    cout << "Hello world!" << endl;
    return 0;
}

原文地址:https://blog.csdn.net/weixin_51262605/article/details/134709126

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_34280.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注