zoukankan      html  css  js  c++  java
  • dfs+dp——[Usaco2008 Mar]Cow Travelling游荡的奶牛

    dp[i][j][k]记录在i,j格子里,剩下k步可以到达终点的路径条数
    View Code
    #include<stdio.h>
    #include
    <iostream>
    #include
    <math.h>
    using namespace std;

    bool map[109][109];
    int fa,fb,ea,eb,add;
    int f[4][2]={0,-1,-1,0,0,1,1,0};
    int dp[109][109][19];
    int n,m,all;

    int dfs(int a,int b,int step)
    {
    if(dp[a][b][step]!=-1)return dp[a][b][step];
    if((abs(a-ea)+abs(b-eb))>step)//曼哈顿路径剪枝
    return dp[a][b][step]=0;

    if(step==0)
    {
    if(a==ea&&b==eb)
    return dp[a][b][0]=1;
    else
    return dp[a][b][0]=0;
    }

    int i;
    dp[a][b][step]
    =0;
    for(i=0;i<=3;i++)
    {
    int sa,sb,sstep;
    sa
    =a+f[i][0];
    sb
    =b+f[i][1];
    sstep
    =step-1;

    if(sa>=1&&sa<=n&&sb>=1&&sb<=m&&map[sa][sb]==0)
    {
    dp[a][b][step]
    +=dfs(sa,sb,sstep);
    }
    }
    return dp[a][b][step];
    }

    int main()
    {
    while(scanf("%d%d%d",&n,&m,&all)!=EOF)
    {
    int i,j,k;
    char t;
    for(i=1;i<=n;i++)
    {
    getchar();
    for(j=1;j<=m;j++)
    {
    scanf(
    "%c",&t);
    if(t=='*')
    map[i][j]
    =1;
    else
    map[i][j]
    =0;
    for(k=0;k<=all;k++)
    dp[i][j][k]
    =-1;
    }
    }

    scanf(
    "%d%d",&fa,&fb);
    scanf(
    "%d%d",&ea,&eb);
    add
    =0;
    int te;

    te
    =dfs(fa,fb,all);

    printf(
    "%d\n",te);
    }
    return 0;
    }
  • 相关阅读:
    两道挺有意思的思考题
    IEEE浮点数表示法
    MD5 Bump Mapping
    MD5 PolyBump + DetailBump
    DOOM3 MD5渲染方式的另一种猜测
    Relief Mapping
    如何计算投影纹理坐标
    Toon Shading, step 3
    c++数组初始化赋值
    c++重载部分运算符以及输入输出运算符
  • 原文地址:https://www.cnblogs.com/huhuuu/p/1993058.html
Copyright © 2011-2022 走看看