如何在代码问题中解决这个问题

时间:2019-10-21 22:09:06

标签: c++

您将获得2个国际象棋骑士职位。

您的任务很简单,只需找出一个骑士是否可以一个或更少的动作来攻击另一个骑士。

输入 第一行包含2个以空格分隔的整数x1,y1第一个骑士的位置。

下一行包含第二个骑士位置x2,y2。其中(1≤x1,y1,x2,y2≤100)

输出 如果其中一位骑士可以攻击另一位骑士,则打印“是”,否则请打印“否”。

2 个答案:

答案 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-2-y1-1)
  • (x1-2-y1 +1)
  • (x1-1,y1-2)
  • (x1-1,y1 + 2)

  • (x1 + 1,y1-2)

  • (x1 + 1,y1 + 2)
  • (x1 + 2,y1-1)
  • (x1 + 2,y1 + 1)

第二个骑士只要处于其中一个位置,就可以一招或更少的动作食用。

此外,如果我们假设输入(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);