为数字网格尝试所有可能性

时间:2016-08-29 17:53:21

标签: c# algorithm math grid

我正在尝试以编程方式解决数学问题。我有一个6x5网格,有一些预定义的数字,我必须找到其余的数字,所有行和列的条件应该总共34。

//网格

enter image description here

    static int[][] sq;

    static void Main(string[] args)
    {
        sq = new int[6][];

        for (int i = 0; i < sq.Length; i++)
        {
            sq[i] = new int[5] { -250, -250, -250, -250, -250, };
        }

        SetDefaults();

        Print();

        Console.WriteLine("Press enter to quit...");
        Console.ReadLine();
    }

    static void SetDefaults()
    {
        sq[0][0] = 7;
        sq[0][1] = 6;
        sq[0][2] = 8;

        sq[2][2] = 9;
        sq[2][3] = 8;
        sq[2][4] = 5;

        sq[3][1] = 9;
        sq[3][3] = 7;
        sq[3][4] = 5;

        sq[4][0] = 4;
        sq[4][1] = 4;
        sq[4][4] = 9;

        sq[5][0] = 8;
        sq[5][2] = 3;
        sq[5][3] = 6;
        sq[5][4] = 8;
    }

    static void Print()
    {
        Console.WriteLine();
        for (int i = 0; i<sq.Length; i++)
        {
            for (int ii = 0; ii < sq[i].Length; ii++)
            {
                Console.Write("[" + sq[i][ii] + "\t]");
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

我认为一种方法是尝试所有可能性,范围为500个数字,从-250到250,或增量范围(-1,1,然后-2,2等),但我不知道如何以编程方式执行此操作,效率低得多。

1 个答案:

答案 0 :(得分:0)

  

我有一个6x5网格

列数和行数不同? 然后,无论网格中的内容如何,​​根本没有解决办法使所有金额相等。因此,无需编码。

没有付出太多精力,但如果你真的想要枚举某些东西,你可以(但不应该)尝试这种天真且未经优化的方法(对于0到15之间的整数范围):< / p>

for (int a = 0; a < 16; a++) {
for (int b = 0; b < 16; b++) {
for (int c = 0; c < 16; c++) {
for (int d = 0; d < 16; d++) {
for (int e = 0; e < 16; e++) {
for (int f = 0; f < 16; f++) {
for (int g = 0; g < 16; g++) {
for (int h = 0; h < 16; h++) {
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
for (int k = 0; k < 16; k++) {
for (int l = 0; l < 16; l++) {
for (int m = 0; m < 16; m++) {
for (int n = 0; n < 16; n++) {
// test all columns and rows:
// test if 7 + 8 + 9 + a + b == 34
// test if c + d + e + f + g == 34
...
}}}}}}}}}}}}}}

当然可以优化很多,例如:

for (int a = 0; a < 16; a++) {
var b = 34 - 7 - 8 - 9 - a;
for (int c = 0; c < 16; c++) {
for (int d = 0; d < 16; d++) {
for (int e = 0; e < 16; e++) {
for (int f = 0; f < 16; f++) {
var g = 34 - c - d - e - f;
for (int h = 0; h < 16; h++) {
var i = 34 - 9 - 8 - 5 - h;
for (int j = 0; j < 16; j++) {
var k = 34 - 9 - 7 - 5 - j;
for (int l = 0; l < 16; l++) {
var m = 34 - 4 - 4 - 9 - l;
var n = 34 - 8 - 3 - 6 - 8;
// test all columns only:
// test if 7 + c + h + 4 + 8 == 34
...
}}}}}}}}

但最终,最佳优化是返回&#34;没有解决方案&#34;直接