六角幻方
题目描述
把 1 2 3 … 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见下图,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
思路分析
一般在蓝桥杯遇到类似于迷宫的题,首先就要考虑到使用剪枝dfs,本题同理。即在对1~19这19个数字进行全排列的过程中,根据已知条件(每个直线上的数字之和)进行剪枝,每出现一条完整直线时,便判断直线上数字之和是否与之前的数字之和相等。若不相等,则进行剪枝;若相等,则继续深搜。
参考代码
int vis[20];
int res[20];
void dfs(int deep);
int main(){
res[1] = 15;
vis[13] = 1;
vis[15] = 1;
res[2] = 13;
dfs(3);
return 0;
}
void show(){
cout << res[1];
for(int i = 2; i <= 19; i++){
cout << " " << res[i];
}
cout << endl;
}
void dfs(int deep){
//剪枝过程
if(deep == 20){
if(res[1] + res[2] + res[3] != res[1] + res[5] + res[15] + res[10] + res[19]) return;
if(res[1] + res[2] + res[3] != res[17] + res[18] + res[19]) return;
if(res[1] + res[2] + res[3] != res[16] + res[12] + res[19]) return;
show();
return;
}else if(deep == 9){
if(res[1] + res[2] + res[3] != res[1] + res[4] + res[8]) return;
}else if(deep == 8){
if(res[1] + res[2] + res[3] != res[4] + res[5] + res[6] + res[7]) return;
}else if(deep == 13){
if(res[1] + res[2] + res[3] != res[12] + res[8] + res[9] + res[10] + res[11]) return;
if(res[1] + res[2] + res[3] != res[3] + res[7] + res[12]) return;
}else if(deep == 14){
if(res[1] + res[2] + res[3] != res[2] + res[5] + res[9] + res[13]) return;
}else if(deep == 17){
if(res[1] + res[2] + res[3] != res[2] + res[6] + res[11] + res[16]) return;
if(res[1] + res[2] + res[3] != res[13] + res[14] + res[15] + res[16]) return;
}else if(deep == 18){
if(res[1] + res[2] + res[3] != res[8] + res[13] + res[17]) return;
if(res[1] + res[2] + res[3] != res[3] + res[6] + res[10] + res[14] + res[17]) return;
}else if(deep == 19){
if(res[1] + res[2] + res[3] != res[4] + res[9] + res[14] + res[18]) return;
if(res[1] + res[2] + res[3] != res[7] + res[11] + res[15] + res[18]) return;
}
for(int i = 1; i <= 19; i++){
if(vis[i] == 0){
vis[i] = 1;
res[deep] = i;
dfs(deep + 1);
vis[i] = 0;
}
}
}
题后反思
剪枝DFS:即在dfs函数中针对特殊情况提前return,需特殊注意if使用规范以及if判断条件,不然很有可能浪费很久的时间检查(泪目
而且这道题跟八皇后问题类似,建议尝试下面codeup的八皇后: