当前位置: 首页 > 面试题库 >

如何使用对的所有可能组合(+-1,+-2)进行循环

呼延靖
2023-03-14
问题内容

我正在画一个国际象棋骑士的可能路径,一种情况是这样的:

if (boundsOK(x + 1, y + 2)) {
    temp = boardArray[x + 1][y + 2];

    if (isLegalMove(x, y, x + 1, y + 2) != MoveType.NONE) {
        moves.add(x);
        moves.add(y);
        moves.add(x + 1);
        moves.add(y + 2);

        move(x + 1, y + 2, x, y);
    }
    boardArray[x + 1][y + 2] = temp;
}

现在,而不是1和2,我想构造一个循环来尝试组合:

 1  2

-1  2

 1 -2

-1 -2


 2  1

-2  1

 2 -1

-2 -1

但是我不知道如果没有必要怎么做。至少有一种聪明的方法吗?


问题答案:

您可以创建一个Vector类或类似的类(或使用任何类似Pair的类型),用您的值填充列表并对其进行迭代(无需过多考虑性能):

var moves = List.of(
        new Move(1,2),
        new Move(-1,2),
        new Move(1,-2),
        new Move(-1,-2),
        new Move(2,1),
        new Move(-2,1),
        new Move(2,-1),
        new Move(-2,-1));

for (var move : moves) {
    var x = move.getX();
    var y = move.getY();
    testMove(x, y) … // or refactor your method to receive a Move instance directly
}

如果您确实想节省一些行(您是在打高尔夫球吗?),则可以使用循环创建实例,但这并不能真正使代码更好(从可读性,性能,要输入的字符数):

var moves = new ArrayList<Move>();
for (int x : List.of(1,-1)) {
    for (int y : List.of(2,-2)) {
        moves.add(new Move(x,y));
    }
}
for (int x : List.of(2,-2)) {
    for (int y : List.of(1,-1)) {
        moves.add(new Move(x,y));
    }
}

再想一想,如果我们注意到移动总是必须包含数字1和2且从不存在(±1,±1)或(±2)的事实,那么它可能可以浓缩为2个循环和1个条件循环。 ,±2):

var moves = new ArrayList<Move>(8);
var offsets = List.of(-2,-1,1,2);
for (int x : offsets) {
    for (int y : offsets) {
        if (Math.abs(x) != Math.abs(y)) {
            moves.add(new Move(x,y));
        }
    }
}

但是,我仍然认为走KISS(保持简单,愚蠢)路线并简单地写下所有可能的动作是有利的。目的很明显,行数相同(并且您不必想出巧妙的方法来“计算”移动)。



 类似资料:
  • 问题内容: 目前,我试图让所有可能的组合从的,是每一个元素只包含一个字母。 在本身包含相同字母两次甚至更多,他们只应该,因为他们经常会出现使用。 在稍后应该含有最多的给定的长度从最小的2个字母的所有组合。 我在此处搜索了stackoverflow,但只发现了忽略以下事实的置换函数:每个字母仅在出现时才经常使用。 这是我的第一个Swift 2项目,所以请原谅我的绿色态度:) 我想要的是 我目前的做法

  • 我正在组装一个java小程序,使任务在工作中更快、更高效。 用户定义项目列表需要拆分成的三个组的大小。列表中的每个项目根据它被放入三个组中的哪个组具有不同的值。小程序需要显示哪个组合的总价值最高。 示例:带有列的二维整数数组;项目编号、第1组中的值、第2组中的值和第3组中的值。 这样,用户定义组1有3个插槽,组2有3个插槽,组3有2个插槽。 小程序应不按特定顺序显示以下解决方案 我可以管理一种效率

  • 我试图在一个形状为(n,10)的数组中创建所有可能的0和1的组合。例如,如果我们假设一个像这样的任意组合:np.array([0,0,1,1,0,0,1,1,0,0]),我如何生成所有可能的组合(这将产生2^10=1024数组)?

  • 问题内容: 给定表: 名称对于所有人而言都是唯一的 哪种SQL查询可以生成所有可能的n!/(((n-2)!2!)循环组合? 假定Person的基数始终等于4 示例人物= {‘Anna’,’Jerome’,’Patrick’,’Michael’) 输出: 任何帮助,将不胜感激。谢谢! 这是我的答案(我使用了oracle SQL): 问题答案:

  • 假设我有一个数据集: 我使用: 屈服: 我想使用这三行创建不同的组合,为每个组合形成一个数据集。 组合的示例如下: 另一个是: 第三种可能的组合如下: 最后: PS:在前面的示例中,每个组合(一个数据集)至少有两行, 如何在JAVA中实现这一点?非常感谢。