首页 > 代码库 > uva 1600

uva 1600

没有想到第三维的数组,第三维区分同一个位置是否是穿墙到达的,很神奇,还有就是略微的dp思想没想到,同一个数组也是需要取最小值的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=25;
int dict[6][3]={{1,0},{0,1},{-1,0},{0,-1}};
int mapp[maxn][maxn];
int dp[maxn][maxn][maxn];
int t,m,n,k,ans;
void dfs(int x,int y,int step,int wall)
{
    if(x==m&&y==n)
    {
        ans=min(ans,step);
        return ;
    }
    for(int i=0;i<4;i++)
    {
       int xx=x+dict[i][0];
       int yy=y+dict[i][1];
        int st=wall;
        if(mapp[xx][yy]==1) st++;
        else st=0;
        if(xx>=1&&xx<=m&&yy>=1&&yy<=n)
        {
            if((dp[xx][yy][st]<0||dp[xx][yy][st]>step+1)&&st<=k)
            {     dp[xx][yy][st]=step+1;
                dfs(xx,yy,step+1,st);
            }
        }
    }
    return ;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {    ans=1<<30;
        scanf("%d%d%d",&m,&n,&k);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
              scanf("%d",&mapp[i][j]);
        memset(dp,-1,sizeof(dp));
        dfs(1,1,0,0);
        if(ans==1<<30) printf("-1\n");
        else printf("%d\n",ans);
    }
    return 0;
}

 

uva 1600