Haskell实现4×5棋盘士兵斜向移动判断函数isDiagonal
判断棋盘士兵斜向移动的Haskell实现
要实现这个isDiagonal函数很简单,核心就是抓住斜向移动的本质:横向移动的距离和纵向移动的距离必须相等,而且得是真的有移动(不能原地踏步)。
首先定义函数的类型签名,我们用整数元组来表示坐标:
isDiagonal :: (Int, Int) -> (Int, Int) -> Bool
接下来是具体实现,用模式匹配拆解两个坐标的x、y值,计算位移的绝对值,然后判断条件:
isDiagonal (x1, y1) (x2, y2) = let dx = abs (x2 - x1) dy = abs (y2 - y1) in dx == dy && dx /= 0
代码解释
dx = abs (x2 - x1):计算初始位置到目标位置的横向位移绝对值,不管是向左还是向右移动,都取正数。dy = abs (y2 - y1):同理,计算纵向位移的绝对值。dx == dy:这是斜向移动的核心条件——横纵移动的距离必须一致,不管是往哪个斜方向走(左上、右上、左下、右下都满足)。dx /= 0:排除原地不动的情况,毕竟原地不算“移动”。
测试例子
- 你提到的
isDiagonal (1,1) (2,2)会返回True,符合预期。 isDiagonal (1,1) (3,3)→True(长距离斜向移动也满足)isDiagonal (3,4) (1,2)→True(向左下移动)isDiagonal (1,1) (2,3)→False(横向走1格,纵向走2格,距离不等)isDiagonal (2,3) (2,3)→False(原地不动,不算移动)
如果你的场景里允许把原地不动也算作“斜向”(虽然逻辑上不太合理),只需要去掉&& dx /= 0这部分就行,改成dx == dy。
内容的提问来源于stack exchange,提问作者Demiss
相关产品推荐
相关产品推荐

