解决方法:层序遍历
我们定义一个队列 qqq,初始时将第一列的所有行坐标加入队列中。
接下来,我们从第一列开始,逐列进行遍历。对于每一列,我们将队列中的所有行坐标依次取出,然后对于每一个行坐标 iii,我们得到其下一列的所有可能行坐标 kkk,并且满足 grid[i][j]<grid[k][j+1]grid[i][j] < grid[k][j + 1]grid[i][j]<grid[k][j+1],将这些行坐标加入到一个新的集合 ttt 中。如果 ttt 为空,说明我们无法继续移动,返回当前列数。否则,我们将 ttt 赋值给 qqq,继续下一列的遍历。
最后,如果我们遍历完了所有列,说明我们可以移动到最后一列,返回 n−1.。
class Solution {
public:
int maxMoves(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
unordered_set<int> q, t;
for (int i = 0; i < m; ++i)
{
q.insert(i);
}
for (int j = 0; j < n - 1; ++j)
{
t.clear();
for (int i : q)
{
for (int k = i - 1; k <= i + 1; ++k) //能走的行数
{
if (k >= 0 && k < m && grid[i][j] < grid[k][j + 1])
{
t.insert(k);
}
}
}
if (t.empty()) {
return j;
}
q.swap(t);
}
return n - 1;
}