2015年第六届蓝桥杯CC++ A组国赛 —— 第二题:四阶幻方

    xiaoxiao2022-07-12  145

    标题:四阶幻方

    把1~16的数字填入4x4的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。

    四阶幻方可能有很多方案。如果固定左上角为1,请计算一共有多少种方案。 比如: 1 2 15 16 12 14 3 5 13 7 10 4 8 11 6 9

    以及: 1 12 13 8 2 14 7 11 15 3 10 6 16 5 4 9

    就可以算为两种不同的方案。

    请提交左上角固定为1时的所有方案数字,不要填写任何多余内容或说明文字。

    Code

    #include <iostream> #include <algorithm> using namespace std; int num[17]; int sum[11]; int ans[17]; bool vis[17]; long long temp=0; void dfs(int index){ if(index==5){ sum[1]=ans[1]+ans[2]+ans[3]+ans[4]; } if(index==9){ sum[2]=ans[5]+ans[6]+ans[7]+ans[8]; if(sum[2]!=sum[1]) return; } if(index==13){ sum[3]=ans[9]+ans[10]+ans[11]+ans[12]; if(sum[3]!=sum[1]) return; } if(index==14){ sum[5]=ans[1]+ans[5]+ans[9]+ans[13]; sum[10]=ans[4]+ans[7]+ans[10]+ans[13]; if(sum[5]!=sum[1] || sum[10]!=sum[1]) return; } if(index==15){ sum[6]=ans[2]+ans[6]+ans[10]+ans[14]; if(sum[6]!=sum[1]) return; } if(index==16){ sum[7]=ans[3]+ans[7]+ans[11]+ans[15]; if(sum[7]!=sum[1]) return; } if(index==17){ sum[4]=ans[13]+ans[14]+ans[15]+ans[16]; sum[8]=ans[4]+ans[8]+ans[12]+ans[16]; sum[9]=ans[1]+ans[6]+ans[11]+ans[16]; if(sum[4]!=sum[1] || sum[8]!=sum[1] || sum[9]!=sum[1]) return; for(int i=1;i<17;i++){ cout<<ans[i]<<' '; if(i%4==0) cout<<endl; } for(int i=1;i<11;i++){ cout<<"sum["<<i<<"]="<<sum[i]<<' '; } cout<<endl<<endl; temp++; return; } for(int i=1;i<17;i++){ if(!vis[i]){ vis[i]=true; ans[index]=i; dfs(index+1); vis[i]=false; } } } int main(){ for(int i=1;i<17;i++){ num[i]=i; vis[i]=false; } ans[1]=1;vis[1]=true; dfs(2); cout<<temp<<endl; return 0; } Alex 007 认证博客专家 机器学习 NLP TensorFlow 我是 Alex 007,一个热爱计算机编程和硬件设计的小白。为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了。如果你喜欢我的文章的话,给个三连吧!
    最新回复(0)