蓝桥杯五7六角填空暴力ORdfs

来源:互联网 发布:广东裤哥战哭淘宝女郎 编辑:程序博客网 时间:2024/06/06 02:30



标题:六角填数

    如图【1.png】所示六角形中,填入1~12的数字。

    使得每条直线上的数字之和都相同。

    图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容。

暴力:

#include <iostream>#include<cstdio>#include<algorithm>using namespace std;int main(){    int a[13],t;    for(int i=0;i<12;i++)        a[i]=i+1;    while(next_permutation(a,a+12))    {        t=a[1]+a[2]+a[3]+a[4];        if(a[0]==1&&a[1]==8&&a[11]==3&&t==a[7]+a[8]+a[9]+a[10]&&t==a[0]+a[2]+a[5]+a[7]           &&t==a[4]+a[6]+a[9]+a[11]&&t==a[1]+a[5]+a[8]+a[11]&&t==a[0]+a[3]+a[6]+a[10])        {            cout<<a[5];        }    }    return 0;}

总结:next_permutation(a,a+12)这个函数是全排列函数,头文件为algorithm

法二:dfs

#include <iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;int a[13];bool vis[13];void dfs(int k){    int t=a[1]+a[2]+a[3]+a[4];    if(k==12&&a[0]==1&&a[1]==8&&a[11]==3&&t==a[7]+a[8]+a[9]+a[10]&&t==a[0]+a[2]+a[5]+a[7]            &&t==a[4]+a[6]+a[9]+a[11]&&t==a[1]+a[5]+a[8]+a[11]&&t==a[0]+a[3]+a[6]+a[10])    {        cout<<a[5];        return ;    }    for(int i=1; i<=12; i++)    {        if(!vis[i])        {            vis[i]=1;            a[k]=i;            dfs(k+1);            vis[i]=0;            a[k]=0;        }    }}int main(){    memset(a,0,12);///memset(a,0,sizeof(a);    memset(vis,0,12);    dfs(0);    return 0;}
总结:多找些dfs类型的题目做,因为掌握的还不好


0 0