题目:五星填数
如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容。
代码:
#include<iostream>
using namespace std;
int data[10] = {1,2,3,4,5,6,8,9,10,12};
int a[10];
bool jud();
int ways();
int main(int argc,char** argv){
cout << ways();
}
bool jud(){
int s1 = a[1] + a[2] + a[3] + a[4];
int s2 = a[4] + a[6] + a[7] + a[8];
int s3 = a[8] + a[5] + a[2] + a[0];
int s4 = a[0] + a[3] + a[6] + a[9];
int s5 = a[9] + a[7] + a[5] + a[1];
if(s1 == 24 && s2 == 24 && s3 == 24 && s4 == 24 && s5 == 24){
return true;
}
return false;
}
bool jud_temp(){
int a1 = 0,a2 = 0,a3 = 0,a4 = 0,a5 = 0,a6 = 0,a7 = 0,a8 = 0,a9 = 0,a10 = 0;
for(int i = 0;i < 10;i++){
if(a[i] == 1){
a1 = 1;
}else if(a[i] == 2){
a2 = 1;
}else if(a[i] == 3){
a3 = 1;
}else if(a[i] == 4){
a4 = 1;
}else if(a[i] == 5){
a5 = 1;
}else if(a[i] == 6){
a6 = 1;
}else if(a[i] == 8){
a7 = 1;
}else if(a[i] == 9){
a8 = 1;
}else if(a[i] == 10){
a9 = 1;
}else if(a[i] == 12){
a10 = 1;
}
}
if(a1 == 0 || a2 == 0 || a3 == 0 || a4 == 0 || a5 == 0 || a6 == 0 || a7 == 0 || a8 == 0 || a9 ==0 || a10 == 0){
return false;
}else{
return true;
}
}
int ways(){
int nums = 0;
for(int a1 = 0;a1 < 10;a1++){
for(int a2 = 0;a2 < 10;a2++){
for(int a3 = 0;a3 < 10;a3++){
for(int a4 = 0;a4 < 10;a4++){
for(int a5 = 0;a5 < 10;a5++){
for(int a6 = 0;a6 < 10;a6++){
for(int a7 = 0;a7 < 10;a7++){
for(int a8 = 0;a8 < 10;a8++){
for(int a9 = 0;a9 < 10;a9++){
for(int a10 = 0;a10 < 10;a10++){
a[0] = data[a1];
a[1] = data[a2];
a[2] = data[a3];
a[3] = data[a4];
a[4] = data[a5];
a[5] = data[a6];
a[6] = data[a7];
a[7] = data[a8];
a[8] = data[a9];
a[9] = data[a10];
if(jud_temp()){
if(jud()){
nums++;
}
}
}
}
}
}
}
}
}
}
}
}
return nums;
}