XM16. 地鼠逃跑计划
描述
有一只地鼠不小心跑进了一个m*n的矩形田地里,假设地鼠在这块田地的初始位置为(x,y),并且每次只能向相邻的上下左右四个方向移动一步,那么在最多移动K次的情况下,有多少条路径可以逃出这片田地(一旦出去田地的边界就不能再往回走)?输入描述
输入数据包括五个参数:m,n,x,y,K输出描述
输出成功逃跑的路径数量。示例1
输入:
2 3 0 1 2
输出:
6
C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2021-09-03
#include<iostream> #include<vector> using namespace std; int main(void){ int m,n,x,y,k; while(cin>>m>>n>>x>>y>>k){ if(k == 0){ return 0; } long long ans = 0; vector<vector<vector<long long>>> dp(k,vector<vector<long long>>(m,vector<long long>(n,0))); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i == 0){ dp[0][i][j] += 1; } if(i == m-1){ dp[0][i][j] += 1; } if(j == 0){ dp[0][i][j] += 1; } if(j == n-1){ dp[0][i][j] += 1; } } } ans += dp[0][x][y]; for(int s=1;s<k;s++){ for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(i>0){ dp[s][i][j] += dp[s-1][i-1][j]; } if(i<m-1){ dp[s][i][j] += dp[s-1][i+1][j]; } if(j>0){ dp[s][i][j] += dp[s-1][i][j-1]; } if(j<n-1){ dp[s][i][j] += dp[s-1][i][j+1]; } } } ans += dp[s][x][y]; } cout<<ans<<endl; } return 0; }
C++ 解法, 执行用时: 2ms, 内存消耗: 488KB, 提交时间: 2020-07-28
#include <iostream> #include <vector> using namespace std; int main() { int m,n,x,y,k; while(cin >> m >> n >> x >> y >> k) { if(k == 0) return 0; long long ans = 0; vector<vector<vector<long long>>> dp(k, vector<vector<long long>>(m, vector<long long>(n, 0))); for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { if(i == 0) dp[0][i][j] += 1; if(i == m - 1) dp[0][i][j] += 1; if(j == 0) dp[0][i][j] += 1; if(j == n - 1) dp[0][i][j] += 1; } } ans += dp[0][x][y]; for(int s = 1; s < k; ++s) { for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { if(i > 0) dp[s][i][j] += dp[s - 1][i - 1][j]; if(i < m - 1) dp[s][i][j] += dp[s - 1][i + 1][j]; if(j > 0) dp[s][i][j] += dp[s - 1][i][j - 1]; if(j < n - 1) dp[s][i][j] += dp[s - 1][i][j + 1]; } } ans += dp[s][x][y]; } cout << ans << endl; } return 0; }