/*【题目】
标题:六角填数
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
*/
/*【解题思路】
* 解法一:深度优先搜索,同时优化判断条件
* 解法二:暴力枚举
* 得出答案:10
*/
#include<iostream>
using namespace std;
int a[9];//代表9个需填写数字圆圈
int num[9] = {2,4,5,6,7,9,10,11,12};//需要填写在圆圈内的数字
bool step[9];//表示深搜的时走的每一步
void dfs(int currentStep)
{
//当深搜搜索到第6个需填写数字的圆圈时
if(currentStep == 6)
{
if((1 + a[0] + a[3] + a[5]) != (8 + a[0] + a[1] + a[2]))//提前判断能连成一条直线的直线是否满足条件
return;
else if((1 + a[0] + a[3] + a[5]) != (8 + a[0] + a[1] + a[2]))
return;
}
//当深搜搜索到底,即所有圆圈已经填写完毕时
if( currentStep == 9)
{
if((1 + a[0] + a[3] + a[5]) != (8 + a[3] + a[6] + 3))
return;
else if((1 + a[0] + a[3] + a[5]) != (a[2] + a[4] + a[7] + 3))
return;
else if((1 + a[0] + a[3] + a[5]) != (1 + a[1] + a[4] + a[8]))
return;
else if((1 + a[0] + a[3] + a[5]) != (a[5] + a[6] + a[7] + a[8]))
return;
else
{
// for(int i=0;i<9;i++)
// cout<<a[i]<<" ";
// cout<<endl;
cout<<" 星号位置所代表的数字为:"<<a[3];
}
}
else//填数
{
for(int i = 0;i < 9;i++)
{
if(step[i] == false)
{
step[i] = true;
a[currentStep] = num[i];
dfs(currentStep+1);
step[i] = false;
}
}
}
}
int main()
{
dfs(0);
return 0;
}
第五届蓝桥杯软件类省赛真题-C-B-7_六角填数
最新推荐文章于 2018-04-15 09:34:21 发布