1706. 球会落何处
题目大意
- 每个单元格都有一个对角线挡板,可以将球导向左侧或者右侧
- 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示
- 将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示
- 返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1
解题思路
- 球向下滑动的位置(i , j)
将球导向右侧的挡板 | 右下方 (i+1 , j+1) |
---|
将球导向左侧的挡板 | 左下方 (i+1 , j+1) |
- 球是能下滑
可以向右下滑 | grid (i, j) == grid (i , j + 1) |
---|
可以向左下滑 | grid (i, j) == grid (i , j - 1) |
解释 | 向右下滑必须满足当前位置和它右侧位置的挡板同向,同理,向左下滑必须满足当前位置和它左侧的挡板方向一致 |
- 球不能下滑
代码
int* findBall(int** grid, int gridSize, int* gridColSize, int* returnSize){
int *ans = (int*)malloc(sizeof(int)*gridColSize[0]);
int col = 0;
for(int i = 0; i < gridColSize[0]; i++){
col = i;
for(int j = 0; j < gridSize; j++){
int dir = grid[j][col];
col += dir;
if(col < 0 || col == gridColSize[0] || grid[j][col] != dir){
col = -1;
break;
}
}
ans[i] = col;
}
*returnSize = gridColSize[0];
return ans;
}