题目地址
解题思路
这道题的难点在于: 需要理清楚所有可能遇到的情况,并将它没有bug地表示出来。
具体情况体现为:
- 如果当前挡板向左,且是最左列
- 如果当前挡板向右,且是最右列
- 如果当前挡板向左,且左边的格子的挡板向右
- 如果当前挡板向右,且右边的格子的挡板向左
- 排除上面的情况,如果挡板向右,则列数加一
- 排除上面的情况,如果挡板向左,则列数减一
有关每种情况的实现细节,在下面的代码里都有注释:
代码实现(C++)
class Solution {
public:
vector<int> findBall(vector<vector<int>>& grid)
{
vector<int> res;
for(int i=0;i<grid[0].size();i++)
{
int col=i; //列
int flag=0; //用来判断是否死球
for(int j=0;j<grid.size();j++) //行
{
//1.如果当前挡板向左,且是最左列
if(col==0&&grid[j][col]==-1)
{
flag++;
break;
}
//2.如果当前挡板向右,且是最右列
else if(col==grid[0].size()-1&&grid[j][col]==1)
{
flag++;
break;
}
//3.如果当前挡板向左,且左边的格子的挡板向右
else if(col!=0&&grid[j][col]==-1&&grid[j][col-1]==1)
{
flag++;
break;
}
//4.如果当前挡板向右,且右边的格子的挡板向左
else if(col!=grid[0].size()-1&&grid[j][col]==1&&grid[j][col+1]==-1)
{
flag++;
break;
}
//5.排除上面的情况,如果挡板向右,则列数加一
else if(grid[j][col]==1)
{
col++;
}
//6.排除上面的情况,如果挡板向左,则列数减一
else if(grid[j][col]==-1)
{
col--;
}
}
if(flag)
{
res.push_back(-1);
}
else
{
res.push_back(col);
}
}
return res;
}
};