题目描述如下
shopee的办公室非常大,小虾同学的位置坐落在右上角,而大门却在左下角,可以把所有位置抽象为一个网格(门口的坐标为0,0),小虾同学很聪明,每次只向上,或者向右走,因为这样最容易接近目的地,但是小虾同学不想让自己的boss们看到自己经常在他们面前出没,或者迟到被发现。他决定研究一下如果他不通过boss们的位置,他可以有多少种走法?
思路如下 转移方程dp[i][j]表示到达第(i,j)个位置需要多少种走法,遇到Boss位置的时候,把走法设置为0。然后利用转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]种走法。
#include <iostream>
#include <vector>
using namespace std;
long long int dfs(vector<vector<long long int>>& Map, int x, int y){
for(int i=0; i<=x; ++i)
Map[i][0] = 1;
for(int j=0; j<=y; ++j)
Map[0][j] = 1;
for(int i=1; i<=x; ++i){
for(int j=1; j<=y; ++j){
if(Map[i][j] == -1)
Map[i][j] = 0;
else{
Map[i][j] = Map[i-1][j] + Map[i][j-1];
}
}
}
return Map[x][y];
}
int main(){
int x, y, n;
cin>>x>>y>>n;
vector<vector<long long int>> Map(x+1, vector<long long int>(y+1, 0));
int x0, y0;
while(n--){
cin>>x0>>y0;
Map[x0][y0] = -1;
}
long long int ans =0;
ans = dfs(Map, x, y);
cout<<ans<<endl;
return 0;
}