目录
解题思路:
我们依次遍历每一个球,判断它们的最终位置,小球从上往下落,当小球所在方格的挡板往右偏,并且它右边放格的挡板也往右偏,它就会掉落的下一层,并且列下标也会加一,同理,当小球所在方格的挡板往左偏,并且它左边放格的挡板也往左偏,它就会掉落的下一层,并且列下标也会减一。还有一种情况是当,小球在第一列,挡板不能往左偏,在最后一列挡板不能往右偏,否则小球会卡住。
代码:
int m=grid.size(),n=grid[0].size();//得出几行几列
vector<int> v;//存放结果的数组
int x=0,j;
for(int i=0;i<grid[0].size();i++){//遍历每个球
x=0,j=i;
while(x<m){//循环的截至条件是,小球到达最后一行
if(j == 0 && grid[x][0] == -1 || j == n-1 && grid[x][n-1] == 1){
break;
}//如果小球在第一列并且挡板向右,小球则会卡住,同理,如果小球在最后一列,挡板也会卡住。
if(grid[x][j] == 1 && grid[x][j+1] == 1){//小球所在方格的挡板向右放,它右侧方格也向右放则小球落入了下一层。
x++;
j++;
}else if(grid[x][j] == -1 && grid[x][j-1] == -1){//小球所在方格的挡板向左放,它左侧方格也向右放则小球落入了下一层。
x++;
j--;
}else{//其他情况下会被卡住
break;
}
}
if(x==m){
v.push_back(j);//插入此时小球所在的列下标
}else{
v.push_back(-1);
}
}
return v;