问题标题: 酷町堂:3719 奔跑的小明

0
0
已解决
张睿杰
张睿杰
初级天翼
初级天翼

3719   奔跑的小明

题目描述 Description

在一个m*n的游乐场内,有一群小朋友在玩游戏。游乐场中的一些位置分布着一些设施,阻挡住了小朋友们的道路。现在小明起始在(a,b)这个位置,经过时间为t分钟的疯狂得来回奔跑之后,最终小明停留在了(x,y)这个位置气喘吁吁。已知每分钟小明可以朝上下左右四个方向中的一个移动一步,并且小明可能会来回跑动。请问小明有多少种可能的路线从(a,b)跑到(x,y)。求出可能的路线总数s。

输入描述 Input Description

第一行,三个整数,m n t
接下来m行,每行n个字符,每个字符为'.'或'*',分别表示平地和设施,设施不能通过
最后一行,四个整数,a b x y

输出描述 Output Description

一个整数s,表示可能的路线的总数

样例输入 Sample Input

4 5 6
...*.
...*.
.....
.....
1 3 1 5

样例输出 Sample Output

1

数据范围及提示 Data Size & Hint

2 ≤ m,n ≤ 100, 0<t ≤ 15
巡逻,测试数据加强版

为什么只有40,求大佬给出动归的AC代码

#include <iostream>
#include <cstdio>
using namespace std;
char a[1111][1111];
int m,n,t,ans=0;
int x1,y1,x2,y2;
int dir[5][2]={{0},{-1,0},{0,-1},{1,0},{0,1}};
int dfs(int x1,int y1,int x2,int y2,int cnt)
{
    if(cnt>t) return 0;
    if(cnt==t&&x1==x2&&y1==y2)
    {
        ans++;
        return 0;
    }
    for(int i=1;i<=4;i++)
    {
        int nx=x1+dir[i][0],ny=y1+dir[i][1];
        if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&a[nx][ny]=='.')
            dfs(nx,ny,x2,y2,cnt+1);
    }
}
int main()
{
    cin>>m>>n>>t;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    cin>>x1>>y1>>x2>>y2;
    dfs(x1,y1,x2,y2,0);
    cout<<ans<<endl;
}

0
已采纳
孙志浩
孙志浩
资深守护
资深守护

这道题用动态规划,时间复杂度O(m*n*t)。

设f[x][y][z]表示第z分钟小明到(x,y)的方法数。

边界:f[a][b][0]=1

公式:for(1..4)f[i+dx[i]][j+dy[i]][k+1]+=f[i][j][k]

0
我要回答