五星填数

图1.png

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。

要求每条直线上数字和相等。

如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。

注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。

答案:

代码:

#include <iostream>
using namespace std;
int to[10][2] = {0,1,1,2,2,3,3,4,4,0,0,2,1,3,2,4,3,0,4,1};
bool vis[10];
int va[10] = {1,2,3,4,5,6,8,9,10,12};
int sum[5];
int c;
void dfs(int k) {
    if(k >= 10) {
        c ++;
        return;
    }
    for(int i = 0;i < 10;i ++) {
        if(vis[i] || sum[to[k][0]] + va[i] > 24 || sum[to[k][1]] + va[i] > 24) continue;
        sum[to[k][0]] += va[i];
        sum[to[k][1]] += va[i];
        vis[i] = true;
        dfs(k + 1);
        vis[i] = false;
        sum[to[k][0]] -= va[i];
        sum[to[k][1]] -= va[i];
    }
}
int main() {
    dfs(0);
    printf("%d",c / 10);
}

猜你喜欢

转载自www.cnblogs.com/8023spz/p/10680468.html