我之前的问题已经关闭,因为它过于宽泛,所以我决定编写部分代码,只有在遇到特定问题时才会问问题。
到目前为止,我的代码看到国际象棋棋盘的哪些部分充满了骑士(代码为“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匹马来统治棋盘上的所有领域。
答案 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