C用T和H填充棋盘,不知何故有间隙,只有7行而不是8行

时间:2016-04-19 22:22:28

标签: c chess

我之前的问题已经关闭,因为它过于宽泛,所以我决定编写部分代码,只有在遇到特定问题时才会问问题。

到目前为止,我的代码看到国际象棋棋盘的哪些部分充满了骑士(代码为“H”),并用'T'填充他们支配的部分。目标是用'H'和'T'填充棋盘的所有部分,并且没有在'0'处留下主导的棋盘。然后程序测试所有字段是“T”还是“H”,如果是,则返回1,如果没有,则打印出棋盘。

然而它只打印出7行(尽管仍然是8列),尽管我在棋盘上装满了12个骑士位置以支配整个棋盘,但不知何故还剩下0个。 这是代码:

#include <stdio.h>
#include <stdlib.h>
int filling(char array[7][7])
{
    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]='T';
                if(i+1<8 && j+2<8) array[i+1][j+2]='T';
                if(i-2>-1 && j+1<8) array[i-2][j+1]='T';
                if(i+2<8 && j+1<8) array[i+2][j+1]='T';
                if(i-2>-1 && j-1>-1) array[i-2][j-1]='T';
                if(i+2<8 && j-1>-1) array[i+2][j-1]='T';
                if(i-1>-1 && j-2>-1) array[i-1][j-2]='T';
                if(i+1<8 && j-2>-1) array[i+1][j-2]='T';

            }
        }
    }
}
int checking(char array[7][7])
{
    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;
            else return 1;
        }
   }
}
int main()
{
    int i, j;
    char board[7][7];
    for(i = 0; i < 8; i++)
    {

        for(j = 0; j < 8; j++)
            board[i][j] = '0';
    }
    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 ("Works");
    else printf ("Doesnt work");
   for(i = 0; i < 8; i++)
    {
        printf("\n");
        for(j = 0; j < 8; j++)
            printf("%c ", board[i][j]);
    }
    return 0;
}

您认为这里的问题是什么?我做了什么事吗? 谢谢你的回答。

编辑:犯了一个错误,没有确保马不会变成'T'。这是固定代码:

#include <stdio.h>
#include <stdlib.h>
int pildymas(char array[7][7])
{
    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 tikrinimas(char array[7][7])
{
    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;
            else return 1;
        }
    }
}
int main()
{
    int i, j;
    char board[7][7];
    for(i = 0; i < 8; i++)
    {

        for(j = 0; j < 8; j++)
            board[i][j] = '0';
    }
    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';
    for(i = 0; i < 8; i++)
    {
        printf("\n");
        for(j = 0; j < 8; j++)
            printf("%c ", board[i][j]);
    }
    pildymas(board);
    if(tikrinimas(board) == 1) printf ("Veikia");
    else printf ("neveikia");
    for(i = 0; i < 8; i++)
    {
        printf("\n");
        for(j = 0; j < 8; j++)
            printf("%c ", board[i][j]);
    }
    return 0;
}

我注意到有人说我的阵列没有足够的尺寸。我的印象是阵列A [2]会有A [0] A [1]和A [2]点,这是错误的吗?

感谢您的帮助,我很确定今晚我会回来:))

额外问题

我现在所有的工作都在填充和测试,但我需要找到一种方法来填充12匹马的所有可能组合,我想到的唯一方法是创建一个12周期的循环水平深,意味着它必须做64 ^ 12个周期。有没有其他方法我可以尝试在8x8板上每个可能的12匹马定位?我的计划是采取一个立场,然后测试它是否适合,如果是这样,保存它,然后尝试另一个,直到所有的位置完成。据我所知,只有1匹组合12匹马来统治棋盘上的所有领域。

2 个答案:

答案 0 :(得分:0)

代码已修复并正常工作。

            View view = (View)mCardViewContainer;
            ObjectAnimator animObj = ObjectAnimator.ofFloat(view, "translationY", 0, -200);
            animObj.setDuration(300);
            animObj.start();

            animObj.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mCardViewContainer.setVisibility(View.GONE);
                }
            });

解决了我的问题。以下是我必须改变的事情: 1)在两个维度上将数组大小增加1。 2)确保我的“H”不被“T”覆盖。 3)在检查功能时,我犯了一个错误,即在一个循环中包含返回1,因此只要第一个值有效就会打印出它的工作原理。我在循环中留下了返回0,因为只要有一个空位,它就不起作用,但我在循环后移动了返回1,好像只有没有空格它应该算作成功。

答案 1 :(得分:0)

我不知道你试图在板上创建什么类型的优势,但要使你的索引在7x7数组的正确范围内,你将需要类似于以下内容:

#include <stdio.h>

enum { DIM = 7 };

void filling (char (*array)[DIM])
{
    int i, j;

    for (i = 0; i < DIM; i++)
        for (j = 0; j < DIM; j++)
            if (array[i][j] != 'H') 
                array[i][j] = 'T';
}

int checking (char (*array)[DIM])
{
    int i, j;

    for (i = 0; i < DIM; i++)
        for (j = 0; j < DIM; j++)
            if (array[i][j] != 'H' && array[i][j] != 'T')
                return 0;
    return 1;
}

int main (void) {

    int i, j;
    char board[DIM][DIM] = {{0}};

    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 ("Works");
    else
        printf ("Doesnt work");

    for (i = 0; i < DIM; i++) {
        printf ("\n");
        for (j = 0; j < DIM; j++)
            printf ("%c ", board[i][j]);
    }
    putchar ('\n');

    return 0;
}

示例使用/输出

$ ./bin/chess
Works
T T T T T T T
T T T T T H T
T H H T H H T
T T H T T T T
T T T T T H T
T T H H T H H
T T H T T T T

或者正确消除代码中所有幻数并使用适当常量的美感正在改变1数字是创建8x8所需的全部内容。 e.g。

enum { DIM = 8 };

现在的输出是:

$ ./bin/chess
Works
T T T T T T T T
T T T T T H T T
T H H T H H T T
T T H T T T T T
T T T T T H T T
T T H H T H H T
T T H T T T T T
T T T T T T T T