您将获得2个国际象棋骑士职位。
您的任务很简单,只需找出一个骑士是否可以一个或更少的动作来攻击另一个骑士。
输入 第一行包含2个以空格分隔的整数x1,y1第一个骑士的位置。
下一行包含第二个骑士位置x2,y2。其中(1≤x1,y1,x2,y2≤100)
输出 如果其中一位骑士可以攻击另一位骑士,则打印“是”,否则请打印“否”。
答案 0 :(得分:1)
这是算法。
For all possible destinations for the first knight:
If the destination is the same position as the second knight:
print "Yes"
End.
我建议查找移动骑士的国际象棋规则。并非所有目的地都在国际象棋棋盘范围内。
编辑1:骑士动作表
一种实现是拥有一张可能的骑士动作表:
struct Offset
{
int x_offset;
int y_offset;
};
const std::Offset knight_offsets[] =
{
{1, 2}, // one over, two down
{1, -2}, // one over, two up
//...
};
const unsigned int MAX_KNIGHT_OFFSETS =
sizeof(knight_offsets) / sizeof(knight_offsets[0]);
// ...
bool killed = false;
for (unsigned int i = 0; i < MAX_KNIGHT_OFFSETS; ++i)
{
if ((x1 + knight_offsets[i].x_offset) == x2)
&& (y1 + knight_offsets[i].y_offset) == y2))
{
break;
}
}
if (i < MAX_KNIGHT_OFFSETS)
{
std::cout << "Yes\n";
}
else
{
std::cout << "No\n";
}
算法将偏移量添加到Knight 1的位置,然后检查位置是否与Knight 2相同。如果它们相同,则可以杀死Knight2。
否则,将检查下一步。
答案 1 :(得分:0)
首先,需要知道骑士如何下棋。它以“ L”形移动,并且忽略其路径中的碎片。例如,在Wikipedia - Knight (chess)
中对此行为进行了更好的描述。因此,如果骑士在(x1,y1)位置,则只能移至以下8个空格:
(x1-1,y1 + 2)
(x1 + 1,y1-2)
第二个骑士只要处于其中一个位置,就可以一招或更少的动作食用。
此外,如果我们假设输入(x1,y1,x2,y2)仅由有效位置组成(通常是编解码问题),则无需检查这些位置是否有效。之所以这样,是因为只有在我们知道有效的测试位置和骑士位置匹配的情况下,我们才会获得“是”。
因此,您的代码应如下所示:
canEat = false;
FOR: each one of the (x,y) positions listed above)
IF: x2 == x && y2 == y
canEat = true;
PRINT: canEat ? "YES" : "NO);