美团2020春招编程题
双行道
题目描述
有一个2*n的网格,有一个人位(1,1)的位置,即左上角,他希望从左上角走到右下角,即(2,n)的位置。
在每一次,他可以进行三种操作中的一种:
- 向右走一格,即从(x,y)到(x,y+1)
- 向右上方走一格,即,如果他在(2,y)的位置
- 向右下方走一格,即,如果他在(1,y)的位置可以走到(2,y+1)
问题当然不会这么简单,在这2*n的格子中,有一部分格子上有障碍物,他不能停在障碍物上,当然也不能走出网格,请问他有多少种不同的路线可以
到达(2,n)。输入
输入第一行仅包含一个正整数n,表示网格的长度。(1<=n<=50)
接下来有2行,"X"代表障碍物,"."代表可以停留输出
如果没有可以到达的路线则输出-1,否则输出方案数量。样例输入
5
..X.X
XX...样例输出
2
package main func answer(n int, arr [2][]byte) int { dp := make([][]int, 2) for i := range dp { dp[i] = make([]int, n) } for j := n - 1; j >= 0; j-- { for i := 1; i >= 0; i-- { if arr[i][j] == 'X' { dp[i][j] = 0 } else if j == n-1 { if i == 0 { dp[i][j] = 0 } else { dp[i][j] = 1 } } else if i == 0 { // 右+右下 dp[i][j] = dp[i][j+1] + dp[i+1][j+1] } else if i == 1 { // 右+右上 dp[i][j] = dp[i][j+1] + dp[i-1][j+1] } } } if dp[0][0] > 0 { return dp[0][0] } else { return -1 } }
本菜鸡写的代码AC通过率只有18%,想问问各位大佬们这道题的完整解法。
#美团点评2020春招##美团##春招#