五星填数(蓝桥杯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;
}

猜你喜欢

转载自blog.csdn.net/m0_71934846/article/details/129336863