算法:回溯
语言: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;//回溯
}
}
//选择过 就找下一个
}
}