题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
五星填数
如下图的五星图案节点填上数字:1 ~ 12,除去 7 和 11。 要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。 注意:旋转或镜像后相同的算同一种填法。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路就是全排列+思维判断
注意筛选条件:左右对称(*2)*旋转对称(*5)=10,所以未经筛选的答案/10就是最终结果
同时注意连等的写法
代码:
#include <bits/stdc++.h>
using namespace std;
int a[10]={1,2,3,4,5,6,8,9,10,12};
int b[10];
bool vis[10];
int ans;
void dfs(int s,int step)
{
if(s==step)
{
/*for(int i=0;i<step;i++)
{
printf("%d ",b[i]);
}
printf("\n");*/
int t=b[0]+b[2]+b[5]+b[8];
if(t==b[0]+b[3]+b[6]+b[9]&&t==b[1]+b[2]+b[3]+b[4]&&t==b[1]+b[5]+b[7]+b[9]&&t==b[4]+b[6]+b[7]+b[8]) ans++;
}
for(int i=0;i<10;i++)
{
if(!vis[i])
{
vis[i]=true;
b[s]=a[i];
dfs(s+1,step);
vis[i]=false;
}
}
}
int main()
{
dfs(0,10);
printf("%d",ans/10);
return 0;
}