列表

详情


XM16. 地鼠逃跑计划

描述

有一只地鼠不小心跑进了一个m*n的矩形田地里,假设地鼠在这块田地的初始位置为(x,y),并且每次只能向相邻的上下左右四个方向移动一步,那么在最多移动K次的情况下,有多少条路径可以逃出这片田地(一旦出去田地的边界就不能再往回走)?
下面是样例示意图:

输入描述

输入数据包括五个参数:m,n,x,y,K
其中m和n的范围均为是[1,10],K的范围是[0,10]。
0<=x<m,0<=y<n。

输出描述

输出成功逃跑的路径数量。

示例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;
}

上一题