六角幻方 蓝桥试题

    xiaoxiao2021-03-25  89

    把 1 2 3 … 19 共19个整数排列成六角形状,如下:  要求每个直线上的数字之和必须相等。共有15条直线哦!  再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。    请你填写出中间一行的5个数字。数字间用空格分开。

    参考答案: 

    9 6 5 2 16

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int arr[30]; bool step[20]; int table[30] = {1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19}; void dfs(int ws) { if (ws == 5) { if ((arr[1] + arr[2] + arr[3] + arr[4])!=38)return;//判断之前出现过的直线 } if (ws == 6) { if (38 != 15 + arr[1] + arr[5]) return ; } if (ws == 10) { if ( arr[5] + arr[6] + arr[7] + arr[8] + arr[9]!=38)return; if (10 + arr[4] + arr[9]!=38) return; } if (ws == 11) { if (38 != 13 + arr[2] + arr[6] + arr[10]) return; } if (ws == 14) { if (38 != arr[10] + arr[11] + arr[12] + arr[13])return; if (38 != 13 + arr[3] + arr[8] + arr[13]) return; } if (ws == 15) { if (38 != arr[5] + arr[10] + arr[14]) return; if (38 != 10 + arr[3] + arr[7] + arr[11]+arr[14])return; } if (ws == 17) { if (38 != arr[14] + arr[15]+arr[16]) return; if (38 !=15+ arr[2]+arr[7] + arr[12]+arr[16]) return; if (38 != arr[9] + arr[13] + arr[16]) return; //都符合条件,则打印 for (int i = 5; i < 10; i++) { cout<<arr[i]<<" "; } cout<<endl; return; } for (int i = 0; i < 19; i++) { if (step[table[i]] == false)//没有访问过 ,1~19只能出现一次 { step[table[i]] = true; arr[ws] = table[i]; dfs(ws+1); step[table[i]] = false; } } } int main() { step[15] = step[13] = true; step[10]=true;//1~19每个数字都加了3次 ,一共有15行 (1+2+...+19) *3/15=38,所以每行的和是38 arr[0]=10; dfs(1);//第二行的第一个是标记为arr[0] return 0; } 这题是java组的决赛题目

    转载请注明原文地址: https://ju.6miu.com/read-15249.html

    最新回复(0)