当前位置: 首页 > 知识库问答 >
问题:

国际象棋(骑士)运动,避免下棋

姜宏盛
2023-03-14
public static boolean[][] knightMoves(int r, int c, boolean[][] v){
    if(r <= 7 && c >= 0) v[r+2][c-1] = true;
    if(r <= 7 && c >= 0) v[r+1][c-2] = true;

    if(r <= 7 && c >= 0) v[r+2][c+1] = true;
    if(r <= 7 && c >= 0) v[r+1][c+2] = true;

    if(r <= 7 && c >= 0) v[r-2][c-1] = true;
    if(r <= 7 && c >= 0) v[r-1][c-2] = true;

    if(r <= 7 && c >= 0) v[r-2][c+1] = true;
    if(r <= 7 && c >= 0) v[r-1][c+2] = true;

    return v;
}

共有1个答案

廖永长
2023-03-14

这实际上是几年前ACM编程竞赛中一个问题的一部分。所以最小的代码行数如下所示:

boolean check(int r, int c) {
    return r<8 && r>= 0 && c < 8 && c>=0;
}

然后您可以检查来自(x,y)的每个潜在移动,看看它是否有效:

if check(x+1, y+2) ...
if check(x+2, y+1) ...
if check(x-1, y+2) ...
if (check(x-2, y+1) ...
if check(x+1, y-2) ...
if check(x+2, y-1) ...
if check(x+1, y+2) ...
if (check(x+2, y+1) ...

在哪里...你要做的是合法的搬家。如果“V”是你的板,你从(x,y)开始,这些可能是

if (check(x+1, y+1))
   v(x+1, y+1) = true;  // indicated knight can move there
 类似资料:
  • 我试着用回溯法为骑士之旅问题编写代码。我的代码适用于4x4矩阵,但对于8x8矩阵,它不会在输出屏幕上显示任何内容。 我不知道我做错了什么。 我的代码就是这样工作的: 如果所有的广场都参观过 其他的 > 向solution vector添加下一步动作之一,并递归检查该动作是否会导致解决方案。(一个骑士最多可以走八步。我们在这一步的八步中选择一步)。 如果在上述步骤中选择的移动没有导致解决方案,则从解

  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。

  • 上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。

  • 我是编程的新手,我正在尝试实现一个小的象棋游戏。 我目前正在为每件作品的验证移动而挣扎。 字典是: 我在每个子类中都创建了一个函数(Pawn,Rook,Queen...)这应该能证明这次行动是正确的。语法类似于: 目前,我可以移动任何白色树懒或树懒上有一个黑色的部分(但我不能吃我自己),反之亦然。 我想我使用的是而不是列表列表这一事实使事情变得更加困难。我真的迷路了。这将是惊人的,如果你可以帮助我

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢