蓝桥杯试题 历届试题 六角填数
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
答案
10
将上面九个空由上到下,由左到右依次编号为a[0]~a[8];
那么*代表就是a[3],用全排列对齐进行排列
#include <iostream>
using namespace std;
#include <algorithm>
int a[9] = {2, 4, 5, 6, 7, 9, 10, 11, 12};
int main()
{
while (next_permutation(a, a + 9))
{
if (8 + a[0] + a[1] + a[2] == a[5] + a[6] + a[7] + a[8] &&
a[5] + a[6] + a[7] + a[8] == 1 + a[0] + a[3] + a[5] &&
1 + a[1] + a[4] + a[8] == 1 + a[0] + a[3] + a[5] &&
1 + a[0] + a[3] + a[5] == 8 + a[3] + a[6] + 3 &&
8 + a[3] + a[6] + 3 == 3 + a[2] + a[4] + a[7])
{
cout << a[3] << endl;
}
}
}
最近发现next_permutation()(但是要事先排好序,这个问题不大,sort函数用起来不也挺香的吗)挺好用的,挺暴力的,哈哈。
用深搜又做了一遍,感觉还是没全排列香啊
#include <iostream>
using namespace std;
#include <string>
#include <algorithm>
int a[9] = {2, 4, 5, 6, 7, 9, 10, 11, 12}, b[9];
int visited[9];//标记
void dfs(int m)
{
int i;
if (m == 9)
{
if (8 + b[0] + b[1] + b[2] == b[5] + b[6] + b[7] + b[8] &&
b[5] + b[6] + b[7] + b[8] == 1 + b[0] + b[3] + b[5] &&
1 + b[1] + b[4] + b[8] == 1 + b[0] + b[3] + b[5] &&
1 + b[0] + b[3] + b[5] == 8 + b[3] + b[6] + 3 &&
8 + b[3] + b[6] + 3 == 3 + b[2] + b[4] + b[7])
{
cout << b[3] << endl;
return ;
}
}
for (i = 0 ; i < 9 ; i++)
{
if (!visited[i])
{
b[m] = a[i];
visited[i] = 1;
dfs(m + 1);
visited[i] = 0;
}
}
}
int main()
{
dfs(0);
}
如有错误,麻烦指出。谢谢观看!