是否存在一个由1~9组成的9位数,每个数字只能出现一次,且这个9位数由高到低前i位数能被i整除

436 阅读1分钟

算法:回溯

语言:c/c++

参考了 八皇后的写法

#include <iostream>

using std::cout;
using std::endl;
// 分析可知 第 2 4 6 8 位只可能是 2 4 6 8
// 第 1 3 7 9 位只可能是 1 3 7 9
// 第 5 位 绝对是 5

int a;//存放位置
int oddN[4],evenN[4];//1 3 7 9 和 2 4 6 8  表示是否被选择过
int total;//解的数量

void setNumber(int k);//设定第i位

int main() {
    total = 0;
    for(int i = 0; i<4;i++){
        oddN[i] = 0;
        evenN[i] = 0;
    }
    setNumber(1);
    return 0;
}

void setNumber(int k){
    if(k<1){
        return;
    }
    if(k == 10 ){
        total ++;
        cout << a << endl;
    }
    if(k == 5){
        a =  10*a + 5;
        setNumber(6);
        a/=10;
        return;
    }
    bool isEven = (k%2==0); //判断 k 的奇偶
    int *test = isEven?evenN:oddN;//选择可取值的域
    for(int i = 0; i<4 ;i++){//第k个数找值 test[i]
        if(!test[i]){//如果没有选择过
            int j = isEven?(i+1)*2:(i<2)?i*2+1:i*2+3;// 0~3 映射 偶数 2 4 6 8  奇数 1 3 7 9
            int temp = 10 * a + j;
            if(temp%k==0){//如果可以整除
                test[i] = 1;
                a = temp;
                setNumber(k+1);
                a/=10;
                test[i] = 0;//回溯
            }
        }
        //选择过 就找下一个
    }
}