gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:02 25 4
gpt4 key购买 nike

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

到目前为止,我的代码看到了棋盘的哪些部分充满了骑士(代码为“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com