给定N * M的矩阵,找到最小值。在最坏的情况下,到达特定细胞的步骤?

时间:2014-03-03 05:43:12

标签: c++ math matrix logic

可以从任何细胞进入矩阵,每个细胞都包含一些关于需要找到的细胞位置的线索,如

Total 8 types of clues can be present:

Exactly Above it
Exactly Below it
Exactly To the Right
Exactly To the Left
In the Top Right Region
In the Bottom Right Region
In the Top Left Region
In the Bottom Left Region

在每个步骤中,他可以按照上述八个动作移动到一个相邻的单元格。 我的问题是最低限度。在最坏的情况下他需要采取的步骤才能到达那个牢房。

     Test Case :
     2 2       : 1
     3 3       : 1 

我的解决方案看起来像这样: 我想如果我从矩阵的中间区域开始,那么我将不得不采取最小值。步骤。

   cin >> n >> m ;
   ans = max ( n/2 , m/2 ) ;

但显然这是错误的。 正确的解决方案看起来像这样

   cin >> n >> m ;
   ans = log( max(n,m) , 2) ; //base 2

任何人都能解释一下吗?

问题可以在这里找到:http://www.codechef.com/TRNT2014/problems/TR001

2 个答案:

答案 0 :(得分:3)

这两项:

In each step he can move to one adjacent cell as per the above eight movements.

The correct solution looked like this:
  ans = log( max(n,m) , 2) ; //base 2

是矛盾的。如果第一个是真的,那么你的解决方案是正确的。如果第二个为真,则第一个必须为假,并且他可以跳转到任何单元格(或至少一个单元格(n / 4,m / 4))。

答案 1 :(得分:2)

与上面的描述相反,链接的描述似乎限制了您可以随时检查的框。

因此,正确的方法似乎基本上是2D二进制搜索。从中间框开始。如果(例如)线索说正确的方框是向上和向右,则向该角移动一半的距离。此时,它可能会说(例如)正确的框在向上和向左。如果是这样,你移动方向的一半距离。

简而言之,它是一个二分搜索,除了每个点的结果是一个向量 - 一个方向和一个距离 - 而不仅仅是一个典型的一维二分搜索中的距离。