三位数

1, 2, 3, 4, 5, 6 组成的每一位都不相同的三位数按照从小到大的顺序排列,计算第  100100  的数和第  90

90 个数的差。

/*
最初做我是从后往前一个一个把数写出来的
做完后想了想, 排列permutation(6, 3) = 120
每个数开头都有120/6 = 20
第90大和第100大都是5开头的, 并且剩下的两位是permutation(5, 2)
这样比较好找出来答案

后来发现dfs的做法
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 10;
int n = 6;
int seq[maxn];
int visited[maxn];
vector<int> ans;
void dfs(int cnt);
void count();
int main() {
    for(int i = 0; i < 6; ++i)
        seq[i] = i + 1;
    dfs(0);// 从第0位开始
    cout <<
    // 在下方填入答案
    564 - 532
    << endl;
    // cout << ans[100 - 1] - ans[90 - 1] << endl; // dfs
    return 0;
}
void count()
{// 通过1是百位, 2是十位, 3是个位去计算排列的值
    int sum = 0;
    for(int i = 0; i < 6; ++i){
        switch(visited[i]){
            case 0:
                break;
            case 1:
                sum += seq[i] * 100;
                break;
            case 2:
                sum += seq[i] * 10;
                break;
            case 3:
                sum += seq[i];
                break;
            default:
                break;
        }
    }
    ans.push_back(sum);
}
void dfs(int cnt)
{
    if(cnt == 3){// 到第3位结束
        count();
        return;
    }
    for(int i = 0; i < n; ++i)
        if(visited[i] == 0){
            visited[i] = cnt + 1;// visited = 1是第一次选择的, 表示百位数
            dfs(cnt + 1);
            visited[i] = 0;// 要回溯
        }

}

猜你喜欢

转载自blog.csdn.net/u013482363/article/details/79378859