首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用T和H填充棋盘,不知何故只有7行,而不是8排。

用T和H填充棋盘,不知何故只有7行,而不是8排。
EN

Stack Overflow用户
提问于 2016-04-19 22:22:28
回答 2查看 273关注 0票数 0

我的前一个问题已经结束了,因为它太宽泛了,所以我决定分部分编写代码,如果我有特定的问题,我只会问一些问题。

到目前为止,我的代码看到棋盘中哪些部分充满了骑士(在代码“H”中),并用“T”填充了它们所占的部分。目标是用“H”和“T”填充棋盘的各个部分,而不是在'0‘时控制棋盘的各个部分。然后程序测试是否所有字段都是'T‘或'H',如果是返回1,如果不是0。然后打印出棋盘。

然而,它只打印出7行(尽管仍有8列),即使我在棋盘上填满了12位能够统治整个棋盘的骑士,不知怎的,还有0。以下是代码:

代码语言:javascript
复制
#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’,这是一个错误。这是固定的代码:

代码语言:javascript
复制
#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;
}

我注意到人们说我的数组没有足够的大小。我的印象是数组A2会有A A1和A2点,这是错的吗?

谢谢你的帮助,我很肯定我今晚会回来:)

附加问题

我现在所有的工作都与填充和测试,但我需要找到一种方法来填充所有可能的组合12匹马,我唯一的想法是创造一个12层深的循环,这意味着它必须做64^12周期。还有什么其他的方法,我可以尝试每12匹马在8x8板上的每一个可能的位置吗?我的计划是采取一个位置,然后测试它是否适合,如果是这样保存它,然后尝试另一个,直到所有的位置都完成。据我所知,只有12匹马的组合控制着董事会的所有领域。

EN

回答 2

Stack Overflow用户

发布于 2016-04-19 22:43:11

代码与所有的固定和工作。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
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';

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

解决了我的问题。下面是我必须改变的事情: 1)在两个维度中增加1的数组大小。2)确保我的'H's不会被T‘s覆盖。3)在检查函数时,我犯了错误,将返回1包含在一个循环中,因此,只要第一个值正常工作,它就会打印出来。我在循环中留下了返回0,因为只要有一个点空,它就不工作了,但我在循环之后移动了返回1,好像只有一个空空间,它应该算成功。

票数 0
EN

Stack Overflow用户

发布于 2016-04-19 22:43:22

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

代码语言:javascript
复制
#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;
}

示例使用/输出

代码语言:javascript
复制
$ ./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所需要的。例如:

代码语言:javascript
复制
enum { DIM = 8 };

现在的输出是:

代码语言:javascript
复制
$ ./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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36730540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档