题意:如图所示,填充1~14在14个位置上,不重不漏,要求每条直线上的值相等,已经给出3个位置的数字,所以答案唯一!~
分析:搜索填充,然后判断是否符合每条线值相等
数组下标对应如下图:
cout<<10<<" "<<3<<" "<<9<<" "<<8<<endl;///答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
#define mem(a,b) memset(a,b,sizeof(a))
int book[20];
int a[20];
bool check() {///判断7条直线的值
int b[10]= {0};
for(int i=1; i<=4; i++)
b[1]+=a[i];
for(int i=4; i<=7; i++)
b[2]+=a[i];
b[3]=a[14]+a[8]+a[6]+a[13];
b[4]=a[1]+a[11]+a[9]+a[14];
for(int i=10; i<=12; i++)
b[5]+=a[i];
b[5]+=a[2];
for(int i=7; i<=10; i++)
b[6]+=a[i];
b[7]=a[12]+a[13]+a[3]+a[5];
sort(b+1,b+8);
if(b[1]==b[7]) {
// for(int i=1; i<=14; i++)
// cout<<a[i]<<" + ";
// cout<<a[10]<<" "<<a[12]<<" "<<a[13]<<" ";
return true;
}
return false;
}
void dfs(int n) {
if(n==10||n==12||n==13) {///如果是题意给出的定值 就到下一个位置
dfs(n+1);
return;
}
if(n>14) {
if(check()) {
for(int i=1; i<=4; i++)
cout<<a[i]<<" ";
cout<<endl;
}
return ;
}
for(int i=1; i<15; i++) {
if(book[i]==0) {
book[i]=1;
a[n]=i;
dfs(n+1);
// a[n]=0;
book[i]=0;///回溯
}
}
}
int main() {
a[12]=6,a[10]=14,a[13]=11;
book[6]=1,book[11]=1,book[14]=1;
dfs(1);
return 0;
}