之前有位同事跟我打赌,给我一周时间让我算一道题,算出来赏50块钱.题目如下:
把数1到19分别填到下面的O中,使每个横行、斜行的数加起来都等于38
O O O
O O O O
O O O O O
O O O O
O O O
我高兴的答应了,在开始三天时刻想着这个问题,还拿个本子画来画去.没有结果,我想到编程解决它.但我不会.于是叫个朋友帮我写了个程序.它是用C写的(怎么写的我不清楚,那时对编程通了六窍,^_^),然后告诉我,用现在的PC算要算很久.运行了几个小时,果然没有结果.一周过去了,我输了...
这段时间在学C#,想到那个问题,自己的写了一个,很快算出了结果(我想当时那朋友没有认真对待分析,我分析了一下,得到很多条件,这样电脑就不用那么累了~~),有12种组合.观察了一下,其实只有一种.其它都这个是组合镜像与旋转得来的(难不得最初做这题的人用了近50年的时间,不过他还少个条件,不知道和是多少):
3 19 16
17 7 2 12
18 1 5 4 10
11 6 8 13
9 14 15
程序写得不怎么样,也拿出来晾晾吧,请大虾米指教一二!
把数1到19分别填到下面的O中,使每个横行、斜行的数加起来都等于38
O O O
O O O O
O O O O O
O O O O
O O O
我高兴的答应了,在开始三天时刻想着这个问题,还拿个本子画来画去.没有结果,我想到编程解决它.但我不会.于是叫个朋友帮我写了个程序.它是用C写的(怎么写的我不清楚,那时对编程通了六窍,^_^),然后告诉我,用现在的PC算要算很久.运行了几个小时,果然没有结果.一周过去了,我输了...
这段时间在学C#,想到那个问题,自己的写了一个,很快算出了结果(我想当时那朋友没有认真对待分析,我分析了一下,得到很多条件,这样电脑就不用那么累了~~),有12种组合.观察了一下,其实只有一种.其它都这个是组合镜像与旋转得来的(难不得最初做这题的人用了近50年的时间,不过他还少个条件,不知道和是多少):
3 19 16
17 7 2 12
18 1 5 4 10
11 6 8 13
9 14 15
程序写得不怎么样,也拿出来晾晾吧,请大虾米指教一二!
using
System;
using System.Collections.Generic;
using System.Text;
/**/ /// <summary>
/// 把数1到19分别填到下面的O中,是得没个横行、斜行(包括左右斜行)的数加起来都等于38
/// O O O
/// O O O O
/// O O O O O
/// O O O O
/// O O O
/// RL的编的第一个算法程序
/// </summary>
class _19Sum38
... {
public static void Main()
...{
/**//// aO a1 bO
/// f1 x1 x2 b1
/// fO z2 z0 y1 cO
/// e1 z1 y2 c1
/// eO d1 dO
//先算六条边上的组合 3个数6个组
//int a0, a1, b0, b1, c0, c1, d0, d1, e0, e1, f0, f1;
//算三条对角线的组合 5个数3个组
// z0(中心点)
// a0, x1, y2, d0,
// b0, x2, z1, e0,
// c0, y1, z2, f0;
//算三条对角线的组合 4个数6个组
// a1, x2, y1, c1,
// b1, y1, y2, d1,
// c1, y2, z1, e1;
// d1, z1, z2, f1,
// e1, z2, x1, a1;
// f1, x1, x2, b1,
int count = 0;
try
...{
Console.WriteLine("题目: 把数1到19分别填到下面的O中,是得没个横行、斜行(包括左右斜行)的数加起来都等于38 " +
"/// O O O " +
"/// O O O O " +
"/// O O O O O " +
"/// O O O O " +
"/// O O O " +
"/// " +
"/// /// aO a1 bO " +
"/// /// f1 x1 x2 b1 " +
"/// /// fO z2 z0 y1 cO " +
"/// /// e1 z1 y2 c1 " +
"/// /// eO d1 dO " +
"开始运算:");
for (int a0 = 19; a0 > 0; a0--)
...{
for (int a1 = 19; a1 > 0; a1--)
...{
if (a1 != a0)
...{
for (int b0 = 19; b0 > 0; b0--)
...{
if ((a0 + a1 + b0 == 38) && b0 != a0 && b0 != a1 )
...{
for (int b1 = 19; b1 > 0; b1--)
...{
if (b1 != a0 && b1 != a1 && b1 != b0)
...{
for (int c0 = 19; c0 > 0; c0--)
...{
if ((b0 + b1 + c0 == 38) && (c0 != a0 && c0 != a1 && c0 != b0 && c0 != b1))
...{
for (int c1 = 19; c1 > 0; c1--)
...{
if (c1 != a0 && c1 != a1 && c1 != b0 && c1 != b1 && c1 != c0)
...{
for (int d0 = 19; d0 > 0; d0--)
...{
if ((c0 + c1 + d0 == 38) && (d0 != a0 && d0 != a1 && d0 != b0 && d0 != b1 && d0 != c0 && d0 != c1))
...{
for (int d1 = 19; d1 > 0; d1--)
...{
if (d1 != a0 && d1 != a1 && d1 != b0 && d1 != b1 && d1 != c0 && d1 != c1 && d1 != d0)
...{
for (int e0 = 19; e0 > 0; e0--)
...{
if ((d0 + d1 + e0 == 38) && (e0 != a0 && e0 != a1 && e0 != b0 && e0 != b1 && e0 != c0 && e0 != c1 && e0 != d0 && e0 != d1))
...{
for (int e1 = 19; e1 > 0; e1--)
...{
if (e1 != a0 && e1 != a1 && e1 != b0 && e1 != b1 && e1 != c0 && e1 != c1 && e1 != d0 && e1 != d1 && e1 != e0)
...{
for (int f0 = 19; f0 > 0; f0--)
...{
if ((e0 + e1 + f0 == 38) && (f0 != a0 && f0 != a1 && f0 != b0 && f0 != b1 && f0 != c0 && f0 != c1 && f0 != d0 && f0 != d1 && f0 != e0 && f0 != e1)
)
...{
for (int f1 = 19; f1 > 0; f1--)
...{
if (f1 != a0 && f1 != a1 && f1 != b0 && f1 != b1 && f1 != c0 && f1 != c1 && f1 != d0 && f1 != d1 && f1 != e0 && f1 != e1 && f1 != f0)
...{
if ((f0 + f1 + a0 == 38) && (2 * a0 + a1 + 2 * b0 + b1 + 2 * c0 + c1 + 2 * d0 + d1 + 2 * e0 + e1 + 2 * f0 + f1 == 38 * 6))
...{
for (int z0 = 1; z0 <= 19; z0++)
...{//中心
if (z0 != a0 && z0 != a1 && z0 != b0 && z0 != b1 && z0 != c0 && z0 != c1 && z0 != d0 && z0 != d1 && z0 != e0 && z0 != e1 && z0 != f0 && z0 != f1)
...{
for (int x1 = 1; x1 <= 19; x1++)
...{
if (x1 != a0 && x1 != a1 && x1 != b0 && x1 != b1 && x1 != c0 && x1 != c1 && x1 != d0 && x1 != d1 && x1 != e0 && x1 != e1 && x1 != f0 && x1 != f1 && x1 != z0)
...{
for (int y2 = 1; y2 <= 19; y2++)
...{
if ((y2 != a0 && y2 != a1 && y2 != b0 && y2 != b1 && y2 != c0 && y2 != c1 && y2 != d0 && y2 != d1 && y2 != e0 && y2 != e1 && y2 != f0 && y2 != f1 && y2 != z0 && y2 != x1) && (a0 + x1 + y2 + d0 + z0 == 38))//对角线一
...{
for (int y1 = 1; y1 <= 19; y1++)
...{
if (y1 != a0 && y1 != a1 && y1 != b0 && y1 != b1 && y1 != c0 && y1 != c1 && y1 != d0 && y1 != d1 && y1 != e0 && y1 != e1 && y1 != f0 && y1 != f1 && y1 != z0 && y1 != x1 && y1 != y2)
...{
for (int z2 = 1; z2 <= 19; z2++)
...{
if ((z2 != a0 && z2 != a1 && z2 != b0 && z2 != b1 && z2 != c0 && z2 != c1 && z2 != d0 && z2 != d1 && z2 != e0 && z2 != e1 && z2 != f0 && z2 != f1 && z2 != z0 && z2 != x1 && z2 != y2 && z2 != y1) && (c0 + y1 + z2 + f0 + z0 == 38))//对角线二
...{
for (int x2 = 1; x2 <= 19; x2++)
...{
if (x2 != a0 && x2 != a1 && x2 != b0 && x2 != b1 && x2 != c0 && x2 != c1 && x2 != d0 && x2 != d1 && x2 != e0 && x2 != e1 && x2 != f0 && x2 != f1 && x2 != z0 && x2 != x1 && x2 != y2 && x2 != y1 && x2 != z2)
...{
for (int z1 = 1; z1 <= 19; z1++)
...{
if ((z1 != a0 && z1 != a1 && z1 != b0 && z1 != b1 && z1 != c0 && z1 != c1 && z1 != d0 && z1 != d1 && z1 != e0 && z1 != e1 && z1 != f0 && z1 != f1 && z1 != z0 && z1 != x1 && z1 != y2 && z1 != y1 && z1 != z2 && z1 != x2) && (b0 + x2 + z1 + e0 + z0 == 38)//对角线三
&& (a1 + x2 + y1 + c1 == 38) && (b1 + y1 + y2 + d1 == 38) && (c1 + y2 + z1 + e1 == 38) && (d1 + z1 + z2 + f1 == 38) && (e1 + z2 + x1 + a1 == 38) && (f1 + x1 + x2 + b1 == 38))//内三角的边
...{count++; Console.WriteLine("这是第" + count + "种组合:");
Console.Write(" "+a0.ToString()); Console.Write(" "+a1.ToString()); Console.Write(" "+b0.ToString()+" ");
Console.Write(" "+f1.ToString()); Console.Write(" "+x1.ToString()); Console.Write(" "+x2.ToString()); Console.Write(" "+b1.ToString()+" ");
Console.Write(" "+f0.ToString());Console.Write(" "+z2.ToString()); Console.Write(" "+z0.ToString()); Console.Write(" "+y1.ToString()); Console.Write(" "+c0.ToString()+" ");
Console.Write(" "+e1.ToString()); Console.Write(" "+z1.ToString()); Console.Write(" "+y2.ToString()); Console.Write(" "+c1.ToString()+" ");
Console.Write(" "+e0.ToString()); Console.Write(" "+d1.ToString()); Console.Write(" "+d0.ToString()+" ");
Console.WriteLine("==================="); } else
continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else
continue;
}
}
else
continue;
}
}
else
continue;
}
}
else
continue;
}
}
}
catch (Exception ex)
...{
Console.WriteLine(ex.Message);
}
}
}
using System.Collections.Generic;
using System.Text;
/**/ /// <summary>
/// 把数1到19分别填到下面的O中,是得没个横行、斜行(包括左右斜行)的数加起来都等于38
/// O O O
/// O O O O
/// O O O O O
/// O O O O
/// O O O
/// RL的编的第一个算法程序
/// </summary>
class _19Sum38
... {
public static void Main()
...{
/**//// aO a1 bO
/// f1 x1 x2 b1
/// fO z2 z0 y1 cO
/// e1 z1 y2 c1
/// eO d1 dO
//先算六条边上的组合 3个数6个组
//int a0, a1, b0, b1, c0, c1, d0, d1, e0, e1, f0, f1;
//算三条对角线的组合 5个数3个组
// z0(中心点)
// a0, x1, y2, d0,
// b0, x2, z1, e0,
// c0, y1, z2, f0;
//算三条对角线的组合 4个数6个组
// a1, x2, y1, c1,
// b1, y1, y2, d1,
// c1, y2, z1, e1;
// d1, z1, z2, f1,
// e1, z2, x1, a1;
// f1, x1, x2, b1,
int count = 0;
try
...{
Console.WriteLine("题目: 把数1到19分别填到下面的O中,是得没个横行、斜行(包括左右斜行)的数加起来都等于38 " +
"/// O O O " +
"/// O O O O " +
"/// O O O O O " +
"/// O O O O " +
"/// O O O " +
"/// " +
"/// /// aO a1 bO " +
"/// /// f1 x1 x2 b1 " +
"/// /// fO z2 z0 y1 cO " +
"/// /// e1 z1 y2 c1 " +
"/// /// eO d1 dO " +
"开始运算:");
for (int a0 = 19; a0 > 0; a0--)
...{
for (int a1 = 19; a1 > 0; a1--)
...{
if (a1 != a0)
...{
for (int b0 = 19; b0 > 0; b0--)
...{
if ((a0 + a1 + b0 == 38) && b0 != a0 && b0 != a1 )
...{
for (int b1 = 19; b1 > 0; b1--)
...{
if (b1 != a0 && b1 != a1 && b1 != b0)
...{
for (int c0 = 19; c0 > 0; c0--)
...{
if ((b0 + b1 + c0 == 38) && (c0 != a0 && c0 != a1 && c0 != b0 && c0 != b1))
...{
for (int c1 = 19; c1 > 0; c1--)
...{
if (c1 != a0 && c1 != a1 && c1 != b0 && c1 != b1 && c1 != c0)
...{
for (int d0 = 19; d0 > 0; d0--)
...{
if ((c0 + c1 + d0 == 38) && (d0 != a0 && d0 != a1 && d0 != b0 && d0 != b1 && d0 != c0 && d0 != c1))
...{
for (int d1 = 19; d1 > 0; d1--)
...{
if (d1 != a0 && d1 != a1 && d1 != b0 && d1 != b1 && d1 != c0 && d1 != c1 && d1 != d0)
...{
for (int e0 = 19; e0 > 0; e0--)
...{
if ((d0 + d1 + e0 == 38) && (e0 != a0 && e0 != a1 && e0 != b0 && e0 != b1 && e0 != c0 && e0 != c1 && e0 != d0 && e0 != d1))
...{
for (int e1 = 19; e1 > 0; e1--)
...{
if (e1 != a0 && e1 != a1 && e1 != b0 && e1 != b1 && e1 != c0 && e1 != c1 && e1 != d0 && e1 != d1 && e1 != e0)
...{
for (int f0 = 19; f0 > 0; f0--)
...{
if ((e0 + e1 + f0 == 38) && (f0 != a0 && f0 != a1 && f0 != b0 && f0 != b1 && f0 != c0 && f0 != c1 && f0 != d0 && f0 != d1 && f0 != e0 && f0 != e1)
)
...{
for (int f1 = 19; f1 > 0; f1--)
...{
if (f1 != a0 && f1 != a1 && f1 != b0 && f1 != b1 && f1 != c0 && f1 != c1 && f1 != d0 && f1 != d1 && f1 != e0 && f1 != e1 && f1 != f0)
...{
if ((f0 + f1 + a0 == 38) && (2 * a0 + a1 + 2 * b0 + b1 + 2 * c0 + c1 + 2 * d0 + d1 + 2 * e0 + e1 + 2 * f0 + f1 == 38 * 6))
...{
for (int z0 = 1; z0 <= 19; z0++)
...{//中心
if (z0 != a0 && z0 != a1 && z0 != b0 && z0 != b1 && z0 != c0 && z0 != c1 && z0 != d0 && z0 != d1 && z0 != e0 && z0 != e1 && z0 != f0 && z0 != f1)
...{
for (int x1 = 1; x1 <= 19; x1++)
...{
if (x1 != a0 && x1 != a1 && x1 != b0 && x1 != b1 && x1 != c0 && x1 != c1 && x1 != d0 && x1 != d1 && x1 != e0 && x1 != e1 && x1 != f0 && x1 != f1 && x1 != z0)
...{
for (int y2 = 1; y2 <= 19; y2++)
...{
if ((y2 != a0 && y2 != a1 && y2 != b0 && y2 != b1 && y2 != c0 && y2 != c1 && y2 != d0 && y2 != d1 && y2 != e0 && y2 != e1 && y2 != f0 && y2 != f1 && y2 != z0 && y2 != x1) && (a0 + x1 + y2 + d0 + z0 == 38))//对角线一
...{
for (int y1 = 1; y1 <= 19; y1++)
...{
if (y1 != a0 && y1 != a1 && y1 != b0 && y1 != b1 && y1 != c0 && y1 != c1 && y1 != d0 && y1 != d1 && y1 != e0 && y1 != e1 && y1 != f0 && y1 != f1 && y1 != z0 && y1 != x1 && y1 != y2)
...{
for (int z2 = 1; z2 <= 19; z2++)
...{
if ((z2 != a0 && z2 != a1 && z2 != b0 && z2 != b1 && z2 != c0 && z2 != c1 && z2 != d0 && z2 != d1 && z2 != e0 && z2 != e1 && z2 != f0 && z2 != f1 && z2 != z0 && z2 != x1 && z2 != y2 && z2 != y1) && (c0 + y1 + z2 + f0 + z0 == 38))//对角线二
...{
for (int x2 = 1; x2 <= 19; x2++)
...{
if (x2 != a0 && x2 != a1 && x2 != b0 && x2 != b1 && x2 != c0 && x2 != c1 && x2 != d0 && x2 != d1 && x2 != e0 && x2 != e1 && x2 != f0 && x2 != f1 && x2 != z0 && x2 != x1 && x2 != y2 && x2 != y1 && x2 != z2)
...{
for (int z1 = 1; z1 <= 19; z1++)
...{
if ((z1 != a0 && z1 != a1 && z1 != b0 && z1 != b1 && z1 != c0 && z1 != c1 && z1 != d0 && z1 != d1 && z1 != e0 && z1 != e1 && z1 != f0 && z1 != f1 && z1 != z0 && z1 != x1 && z1 != y2 && z1 != y1 && z1 != z2 && z1 != x2) && (b0 + x2 + z1 + e0 + z0 == 38)//对角线三
&& (a1 + x2 + y1 + c1 == 38) && (b1 + y1 + y2 + d1 == 38) && (c1 + y2 + z1 + e1 == 38) && (d1 + z1 + z2 + f1 == 38) && (e1 + z2 + x1 + a1 == 38) && (f1 + x1 + x2 + b1 == 38))//内三角的边
...{count++; Console.WriteLine("这是第" + count + "种组合:");
Console.Write(" "+a0.ToString()); Console.Write(" "+a1.ToString()); Console.Write(" "+b0.ToString()+" ");
Console.Write(" "+f1.ToString()); Console.Write(" "+x1.ToString()); Console.Write(" "+x2.ToString()); Console.Write(" "+b1.ToString()+" ");
Console.Write(" "+f0.ToString());Console.Write(" "+z2.ToString()); Console.Write(" "+z0.ToString()); Console.Write(" "+y1.ToString()); Console.Write(" "+c0.ToString()+" ");
Console.Write(" "+e1.ToString()); Console.Write(" "+z1.ToString()); Console.Write(" "+y2.ToString()); Console.Write(" "+c1.ToString()+" ");
Console.Write(" "+e0.ToString()); Console.Write(" "+d1.ToString()); Console.Write(" "+d0.ToString()+" ");
Console.WriteLine("==================="); } else
continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else continue;
}
}
else
continue;
}
}
else
continue;
}
}
else
continue;
}
}
else
continue;
}
}
}
catch (Exception ex)
...{
Console.WriteLine(ex.Message);
}
}
}
哪位朋友写个不知道和的具体数值的?
顺便请教更好的算法,谢谢!