该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
穷举法计算的,在一台16年出厂的i7处理器的普通配置笔记本上,大约0.1秒求出12种解,当然实际上是同一种解的旋转和镜像
#include
#include
/*
01 02 03
12 13 14 04
11 18 19 15 05
10 17 16 06
09 08 07
*/
#define SUM 38
int count=0;
int check(int a[], int check_pos);
void arrange(int a[],int ordinal);
void output(int a[]);
int main() {
int a[20]= {0};
double start,finish;
start = clock();
arrange(a, 1);
finish = clock();
printf( "CLOCKS_PER_SEC %d\n", CLOCKS_PER_SEC);
printf( "%f seconds\n",(finish - start) / CLOCKS_PER_SEC);
return 0;
}
void arrange(int a[],int pos) {
int i,j;
if(pos == 20)
{
count++;
output(a);
}
else {
int b[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};//used flag
for(i=1; i <= pos-1; i++) {
b[a[i]]=0;
}
for(i=1; i<=19; i++) {
if(b[i]!=0) {
a[pos]=i;
if(check(a,pos)==1)
arrange(a,pos+1);
}
}
}
}
int check(int a[],int check_pos) {
if(check_pos==3||check_pos==5||check_pos==7||check_pos==9||check_pos==11) {
if(a[check_pos-2]+a[check_pos-1]+a[check_pos]!=SUM)
return 0;
}
if(check_pos == 2 || check_pos == 4 || check_pos == 6 || check_pos == 8 || check_pos == 10){
if(a[check_pos - 1] + a[check_pos] < 19)
return 0;
}
if(check_pos==12) {
if(a[12] + a[1] + a[11] != SUM)
return 0;
}
if(check_pos==14) {
if(a[12]+a[13]+a[14]+a[4]!=SUM)
return 0;
}
if(check_pos==15) {
if(a[2]+a[14]+a[15]+a[6]!=SUM)
return 0;
}
if(check_pos==16) {
if(a[4]+a[15]+a[16]+a[8]!=SUM)
return 0;
}
if(check_pos==17) {
if(a[10]+a[17]+a[16]+a[6]!=SUM)
return 0;
}
if(check_pos==18) {
if(a[8]+a[17]+a[18]+a[12]!=SUM)
return 0;
if(a[2]+a[13]+a[18]+a[10]!=SUM)
return 0;
}
if(check_pos==19) {
if(a[1]+a[13]+a[19]+a[16]+a[7]!=SUM)
return 0;
if(a[3]+a[14]+a[19]+a[17]+a[9]!=SUM)
return 0;
if(a[11]+a[18]+a[19]+a[15]+a[5]!=SUM)
return 0;
}
return 1;
}
void output(int a[]) {
printf("Case: %d\n", count);
printf(" %02d %02d %02d\n", a[1], a[2], a[3]);
printf(" %02d %02d %02d %02d\n", a[12] ,a[13], a[14], a[4]);
printf("%02d %02d %02d %02d %02d\n", a[11], a[18], a[19], a[15], a[5]);
printf(" %02d %02d %02d %02d\n", a[10], a[17], a[16], a[6]);
printf(" %02d %02d %02d\n", a[9], a[8], a[7]);
printf("\n");
}