幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
答案是一个整数,请通过浏览器直接提交该数字。
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16 这16个数字填写在4 x 4的方格中。
如图p1.jpg所示,即:
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
答案是一个整数,请通过浏览器直接提交该数字。
答案:12
深搜
#include <stdio.h>
#include <string.h>
int map[17];
bool vis[17];
int sum[10];
bool flag;
void dfs(int x)
{
if(flag)
return;
if(x > 16)
{
sum[0] = map[1] + map[2] + map[3] + map[4];
sum[1] = map[5] + map[6] + map[7] + map[8];
sum[2] = map[9] + map[10] + map[11] + map[12];
sum[3] = map[13] + map[14] + map[15] + map[16];
sum[4] = map[1] + map[5] + map[9] + map[13];
sum[5] = map[2] + map[6] + map[10] + map[14];
sum[6] = map[3] + map[7] + map[11] + map[15];
sum[7] = map[4] + map[8] + map[12] + map[16];
sum[8] = map[1] + map[6] + map[11] + map[16];
sum[9] = map[4] + map[7] + map[10] + map[13];
for(int i = 0; i < 9; i++)
if(sum[i] != sum[i + 1])
return;
flag = true;
printf("%d\n", map[12]);
return;
}
if(x == 1 || x == 4 || x == 7 || x == 9 || x == 14 || x == 16)
{
dfs(x + 1);
return;
}
for(int i = 1; i <= 16; i++)
{
if(!vis[i])
{
vis[i] = true;
map[x] = i;
dfs(x + 1);
vis[i] = false;
}
}
}
int main()
{
memset(vis, 0, sizeof(vis));
map[1] = 16;
vis[16] = true;
map[4] = 13;
vis[13] = true;
map[7] = 11;
vis[11] = true;
map[9] = 9;
vis[9] = true;
map[14] = 15;
vis[15] = true;
map[16] = 1;
vis[1] = true;
flag = false;
dfs(1);
return 0;
}