zoukankan      html  css  js  c++  java
  • 挑战程序设计竞赛 2章习题 POJ 3187 Backward Digit Sums DFS

    地址 https://vjudge.net/problem/POJ-3187

    题意是给你一个N(1<=N<=10)
    
    要求将1到N的数字进行排列 然后进行杨辉三角运算
    
    每行的数字等于上一行相同坐标和上一行相同坐标右边的两个数字之和
    
    最后得到唯一的一个数字
    
    现在给予N 和一个M
    
    请问初始的N个数字该如何排列才能得到这个M
    输入
    n m
    n为数字个数 m为要求的最后的杨辉三角的和

    输出
    一行数字使用空格隔开
    为初始的N个数字的排列 如果有多个答案 输出字典序最小的一个
    样例
    Sample Input
    4 16
    Sample Output
    3 1 2 4  (3 2 1 4 也是答案 但是它不是字典序最小的排列)

    解答

    首先按照字典序DFS排列 N个数字,然后得到该排列最后的杨辉三角的顶端的数字 与输入的m比对,寻找答案

    也可以使用杨辉三角的公式直接计算出最后的和 与m进行比较,这里采取的是暴力模拟计算杨辉三角的顶端数字

    #include <iostream>
    
    using namespace std;
    /*
    Sample Input
    4 16
    Sample Output
    3 1 2 4
    */
    
    const int N = 15;
    
    int arr[N];
    int used[N];
    int n, m;
    
    int check[N][N];
    
    //暴力模拟杨辉三角的记录
    bool CheckArr() {
        for (int i = 0; i < n; i++) {
            check[0][i] = arr[i];
        }
    
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < n - i; j++) {
                check[i][j] = check[i - 1][j] + check[i - 1][j + 1];
            }
        }
    
        if (check[n - 1][0] == m) return true;
        return false;
    }
    
    bool dfs(int idx)
    {
        if (idx >= n) {
            if (CheckArr() == true) {
                for (int i = 0; i < n; i++) {
                    cout << arr[i] << " ";
                }
                cout << endl;
                return true;
            }
            return false;
        }
    
        for (int i = 1; i <= n; i++) {
            if (used[i] == 0) {
                used[i] = 1; arr[idx] = i;
                if (true == dfs(idx + 1)) return true;
                used[i] = 0;
            }
        }
        return false;
    }
    
    
    int main()
    {
        cin >> n >> m;
        dfs(0);
        return 0;
    }
  • 相关阅读:
    JS获取图片的缩略图,并且动态的加载多张图片
    小扬的马【未完成】
    小宇和小曾的字符串 【未完成】
    数据库笔记【转】
    分解质因数
    汉诺塔
    排列组合
    数字字符出现频率
    文章中字符数统计
    是否阶乘之和?
  • 原文地址:https://www.cnblogs.com/itdef/p/14327040.html
Copyright © 2011-2022 走看看