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

标签 c chess

我之前的问题已经结束,因为它太广泛了,所以我决定分段编写代码,并且只在遇到特定问题时询问一些问题。

到目前为止,我的代码看到了棋盘的哪些部分充满了骑士(代码为“H”),并用“T”填充了它们占主导地位的部分。目标是用“H”和“T”填充棋盘的所有部分,并且不要在“0”处留下主导 block 。然后程序测试所有字段是否为“T”或“H”,如果是则返回 1,如果否则返回 0。然后打印出棋盘。

但是它只打印出 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 的 for 循环深度,意味着它必须执行 64^12 个周期。有没有其他方法可以尝试 8x8 棋盘上 12 匹马的所有可能位置?我的计划是采取一个位置,然后测试它是否适合,如果适合则保存它,然后尝试另一个位置,直到所有位置都完成。据我所知,只有1\2种12匹马的组合可以称霸棋盘上的所有领域。

最佳答案

我不知道您试图在棋盘上创建什么类型的主导地位,但为了使您的索引处于 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

或者,从代码中正确消除所有魔数(Magic Number)并使用适当的常量的美妙之处在于,只需更改 1 数字即​​可创建 8x8。例如

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

关于C 用 T 和 H 填充棋盘,不知何故有间隙,只有 7 行而不是 8 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730540/

相关文章:

c - C中将中缀表达式转换为后缀(RPN)的最短方法

c - 转换位 vector 需要多少个时钟周期?

c - 动态地为可变大小的结构数组分配空间

python - 更有效地检测支票(国际象棋)

c# - Unity3D iOS 64 位的 IL2CPP 编译器运行时错误

c - C 中是否存在依赖于两个不同分配的整数表示的用例?

c++ - N阶乘有多少位数

artificial-intelligence - 关于换位表的困惑(国际象棋编程)

java - antlr4语法编译错误

optimization - 蒙特卡罗树搜索实现