本文主要是介绍五星填数(蓝桥杯2015年C/C++决赛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
五星填数
如下图的五星图案节点填上数字: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;
}
这篇关于五星填数(蓝桥杯2015年C/C++决赛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!