C算法在棋盘上试用12个骑士的所有可能组合

时间:2016-04-19 23:35:43

标签: c chess

我一直在编写这个程序,试图找到如何将12个骑士放在国际象棋棋盘上,这样所有的方格都可以被骑士占领,或者12个骑士中的一个可以一举到达。到目前为止,我创造了两个功能:一个带有12个骑士的棋盘,用“T”填充所有可以到达的方格,另一个用填充的棋盘填写,并检查是否有任何未被骑士占领的方格由它支配(意味着没有骑士可以一举到达)。

现在我正在处理如何尝试所有可能的骑士组合的问题。我的想法是,在板上12个骑士的每一个组合之后,我将发送有12个骑士的棋盘,以便为他们可以到达的所有方格填充'T',然后将其发送到另一个功能以检查是否所有方块都是支配。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
int filling(char array[8][8])
{
    int i, j;
    for (i = 0;i < 8;i++)
    {
        for (j = 0; j < 8;j++)
        {
            if(array[i][j] == 'H')
            {
                if(i-1>-1 && j+2<8 && array[i-1][j+2]!='H') array[i-1][j+2]='T';
                if(i+1<8 && j+2<8 && array[i+1][j+2]!='H') array[i+1][j+2]='T';
                if(i-2>-1 && j+1<8 && array[i-2][j+1]!='H') array[i-2][j+1]='T';
                if(i+2<8 && j+1<8 && array[i+2][j+1]!='H') array[i+2][j+1]='T';
                if(i-2>-1 && j-1>-1 && array[i-2][j-1]!='H') array[i-2][j-1]='T';
                if(i+2<8 && j-1>-1 && array[i+2][j-1]!='H') array[i+2][j-1]='T';
                if(i-1>-1 && j-2>-1 && array[i-1][j-2]!='H') array[i-1][j-2]='T';
                if(i+1<8 && j-2>-1 && array[i+1][j-2]!='H') array[i+1][j-2]='T';

            }
        }
    }
}
int checking(char array[8][8])
{
    int i, j;
    for(i = 0;i < 8;i++)
    {
        for(j = 0;j < 8;j++)
        {
            if(array[i][j] != 'H' && array[i][j] != 'T')
                return 0;
        }
    }
    return 1;
}
int main()
{
    int i, j;
    char board[8][8];
    for(i = 0; i < 8; i++)
    {

        for(j = 0; j < 8; j++)
            board[i][j] = '0';
    }
    // The following lines are here to test if the checking and filling work
    /*board[2][1] = 'H';
    board[2][2] = 'H';
    board[3][2] = 'H';
    board[5][2] = 'H';
    board[6][2] = 'H';
    board[5][3] = 'H';
    board[2][4] = 'H';
    board[1][5] = 'H';
    board[2][5] = 'H';
    board[4][5] = 'H';
    board[5][5] = 'H';
    board[5][6] = 'H'; */
    filling(board);
    if(checking(board) == 1) printf (" \n Works");
    else printf ("\n Doesnt work");
    for(i = 0; i < 8; i++)
    {
        printf("\n");
        for(j = 0; j < 8; j++)
            printf("%c ", board[i][j]);
    }
    return 0;
}

我可以使用哪种算法来尝试每个组合?谢谢你的回答。

3 个答案:

答案 0 :(得分:1)

你需要这些东西:

  1. 一种排序规则,将所有可能的组合置于明确定义的顺序中。
  2. 初始化规则,用于定义董事会的第一个此类组合。
  3. 一种增量规则,用于以明确定义的顺序将电路板从其当前组合转换为下一个组合。
  4. 检测电路板何时处于最后组合状态的规则。
  5. 然后你只需使用算法2将电路板置于第一状态。然后检查算法4,看看你是否处于最后状态。如果没有,请使用算法3进入下一个状态。

    算法1可能很难。一个简单的规则就是将电路板的位置转换为二进制数,其中空方块为零,而方格定义为明确的整数方格,例如从左上角开始然后穿过,然后转到下一行。

答案 1 :(得分:0)

如果您使用的是体面的,甚至是半合适的硬件,那么您可以使用64位无符号整数类型。我们称之为uint64_t

您可以将具有骑士位置的棋盘存储为单个uint64_t。您还可以在同一类型中存储“支配”掩码。您只需在类型中的64位和棋盘上的64个空格之间建立关联。

由于有64个可能的位置,您可以预先计算每个位置的可能威胁掩码,将其存储为64个uint64_t值的数组。

你需要设置每个骑士的位置。但是你可以按照一定的顺序安全地完成它们,因此骑士#1总是“最高”的骑士 - 他的位置总是最高,或最低,或者其他什么。所以你可以写这样的代码:

for (k0 = 64; k0 > 11; --k0) 
    for (k1 = k0 - 1; k1 > 10; --k1)
        for (k2 = k1 - 1; k2 > 9; --k2) 
            ...
            for (k11 = k10 - 1; k11 >= 0; --k11)
                /* do stuff */

但这太可怕了,因为有可能存在一些可能性(squillion = 1573144097507348889600,谢谢@jwd!)。

也就是说,每个骑士的威胁面具可以从外部骑士的面具“递增”计算,因此执行所有计算可能比尝试存储/标记/计算旋转和翻转更快。董事会。

这样的事情:

for (kXX = kYY - 1; kXX > (11-XX); --kXX) {
    threat_XX = threat_YY | pre_computed_threat[kXX];
    for (kZZ = KXX - 1; kZZ > (11-ZZ); --kZZ) {
        threat_ZZ = threat_XX | pre_computed_threat[kZZ];

这种方法的好处在于您的目标是威胁的全面覆盖 - 换言之,威胁_11地图中的所有1位。您可以通过反转位进行测试并与零进行比较。

答案 2 :(得分:0)

感谢我今天的问题,在我的代表变得更好之前,我被阻止了更多的问题,但是为了我的价值,我自己设法解决了这个问题。我不得不在每个四分之一的棋盘上占据3个位置,只能通过单独的马匹到达,这样我的12个周期缩短了,因为他们只需要经过特定的位置,而不是尝试每一个。执行时间刚好超过一秒,它为12个骑士找到了两个不同的布局,标记为“H”,以及他们可以在一个回合“T”中达到的位置。如果有人遇到这样的问题,这是代码:

#include <stdio.h>
#include <stdlib.h>
struct horses
{
    int x;
    int y;
};
void fill(struct horses arkliai[12], char array[8][8])
{
    int i,j;
    for(i = 0; i < 8; i++)
    {

        for(j = 0; j < 8; j++)
            array[i][j] = '0';
    }
    for(i = 0; i < 12; i++)
    {
        array[arkliai[i].x][arkliai[i].y] = 'H';
    }
    pildymas(array);
}
void startingpositions(struct horses arkliai[12])
{
    int i = 0;
    int j = 0;
    int a = 0;
    for(a = 0; a < 12; a++)
    {
        if(i > 7)
        {
            i = 0;
            j++;
        }
        arkliai[a].x = i;
        arkliai[a].y = j;
        i++;
    }
}
void combinacijos(struct horses h[12], char array[8][8])
{
    int a,b,c,d,e,f,g,hi,ii,ji,k,l;
    for(a = 0; a < 2; a++)
    {
        if(a == 0)
        {
            h[0].x = 1;
            h[0].y = 2;
        }
        if(a == 1)
        {
            h[0].x = 2;
            h[0].y = 1;
        }
        for(b = 0; b < 2; b++)
        {
            if(b == 0)
            {
                h[1].x = 5;
                h[1].y = 1;
            }
            if(b == 1)
            {
                h[1].x = 6;
                h[1].y = 2;
            }
            for(c = 0; c < 2; c++)
            {
                if(c == 0)
                {
                    h[2].x = 1;
                    h[2].y = 5;
                }
                if(c == 1)
                {
                    h[2].x = 2;
                    h[2].y = 6;
                }
                for(d = 0; d <2;d++)
                {
                    if(d == 0)
                    {
                        h[3].x = 5;
                        h[3].y = 6;
                    }
                    if(d == 1)
                    {
                        h[3].x = 6;
                        h[3].y = 5;
                    }
                    for(e = 0; e < 3; e++)
                    {
                        if(e == 0)
                        {
                            h[4].x = 2;
                            h[4].y = 0;
                        }
                        if(e == 1)
                        {
                            h[4].x = 2;
                            h[4].y = 2;
                        }
                        if(e == 2)
                        {
                            h[4].x = 1;
                            h[4].y = 3;
                        }
                        for (f = 0; f < 3; f++)
                            {
                               if(f == 0)
                                {
                                    h[5].x = 1;
                                    h[5].y = 4;
                                }
                                if(f == 1)
                                {
                                    h[5].x = 2;
                                    h[5].y = 5;
                                }
                                if(f == 2)
                                {
                                    h[5].x = 2;
                                    h[5].y = 7;
                                }
                                for (g = 0; g < 3; g++)
                                {
                                    if(g == 0)
                                    {
                                        h[6].x = 5;
                                        h[6].y = 7;
                                    }
                                    if(g == 1)
                                    {
                                        h[6].x = 5;
                                        h[6].y = 5;
                                    }
                                    if(g == 2)
                                    {
                                        h[6].x = 6;
                                        h[6].y = 4;
                                    }
                                for(hi = 0; hi < 3; hi++)
                                    {
                                        if(hi == 0)
                                        {
                                            h[7].x = 5;
                                            h[7].y = 0;
                                        }
                                        if(hi == 1)
                                        {
                                            h[7].x = 5;
                                            h[7].y = 2;
                                        }
                                        if(hi == 2)
                                        {
                                            h[7].x = 6;
                                            h[7].y = 3;
                                        }
                                        for(ii = 0; ii < 4; ii++)
                                        {
                                            if (ii == 0)
                                            {
                                                h[8].x = 3;
                                                h[8].y = 0;
                                            }
                                            if (ii == 1)
                                            {
                                                h[8].x = 3;
                                                h[8].y = 2;
                                            }
                                            if (ii == 2)
                                            {
                                                h[8].x = 0;
                                                h[8].y = 3;
                                            }
                                            if (ii == 3)
                                            {
                                                h[8].x = 2;
                                                h[8].y = 3;
                                            }
                                            for(ji = 0; ji < 4; ji++)
                                            {
                                                if (ji == 0)
                                                {
                                                    h[9].x = 3;
                                                    h[9].y = 7;
                                                }
                                                if (ji == 1)
                                                {
                                                    h[9].x = 3;
                                                    h[9].y = 5;
                                                }
                                                if (ji == 2)
                                                {
                                                    h[9].x = 2;
                                                    h[9].y = 4;
                                                }
                                                if (ji == 3)
                                                {
                                                    h[9].x = 0;
                                                    h[9].y = 4;
                                                }
                                                for(k = 0; k < 4; k++)
                                                {
                                                    if (k == 0)
                                                    {
                                                        h[10].x = 4;
                                                        h[10].y = 7;
                                                    }
                                                    if (k == 1)
                                                    {
                                                        h[10].x = 4;
                                                        h[10].y = 5;
                                                    }
                                                    if (k == 2)
                                                    {
                                                        h[10].x = 5;
                                                        h[10].y = 4;
                                                    }
                                                    if (k == 3)
                                                    {
                                                        h[10].x = 7;
                                                        h[10].y = 4;
                                                    }
                                                    for(l = 0;l < 64;l++)
                                                    {
                                                        if(h[11].x == 7)
                                                        {
                                                            if(h[11].y == 7)
                                                            {
                                                                h[11].x = 0;
                                                                h[11].y = 0;
                                                                break;
                                                            }
                                                            h[11].x = 0;
                                                            h[11].y = h[11].y +1;
                                                        }
                                                       else { h[11].x= h[11].x+1; }
                                                        fill(h, array);
                                                    }
                                                }
                                            }
                                        }

                                    }
                                }
                            }
                    }
                }
            }
        }
    }
}
int pildymas(char array[8][8])
{
    int i, j;
    for (i = 0;i < 8;i++)
    {
        for (j = 0; j < 8;j++)
        {
            if(array[i][j] == 'H')
            {
                if(i-1>-1 && j+2<8 && array[i-1][j+2]!='H') array[i-1][j+2]='T';
                if(i+1<8 && j+2<8 && array[i+1][j+2]!='H') array[i+1][j+2]='T';
                if(i-2>-1 && j+1<8 && array[i-2][j+1]!='H') array[i-2][j+1]='T';
                if(i+2<8 && j+1<8 && array[i+2][j+1]!='H') array[i+2][j+1]='T';
                if(i-2>-1 && j-1>-1 && array[i-2][j-1]!='H') array[i-2][j-1]='T';
                if(i+2<8 && j-1>-1 && array[i+2][j-1]!='H') array[i+2][j-1]='T';
                if(i-1>-1 && j-2>-1 && array[i-1][j-2]!='H') array[i-1][j-2]='T';
                if(i+1<8 && j-2>-1 && array[i+1][j-2]!='H') array[i+1][j-2]='T';

            }
        }
    }
    tikrinimas(array);
}
int tikrinimas(char array[8][8])
{
    int i, j;
    for(i = 0;i < 8;i++)
    {
        for(j = 0;j < 8;j++)
        {
            if(array[i][j] != 'H' && array[i][j] != 'T')
                return 0;
        }
    }
    printas(array);
}
int printas(char array[8][8])
{
    int i,j;
    for(j = 0; j <8; j++)
    {
        printf("\n");
        for(i = 0; i <8 ; i++)
            printf("%c ", array[i][7-j]);
    }
    printf("\n");
}
int main()
{
    struct horses hr[12];
    char board[8][8];
    startingpositions(hr);
    combinacijos(hr, board);
    return 0;
}