uva1600 巡逻机器人

题目可以直接用dfs解决,只需要加一个参数记录当前穿越了多少个障碍,及时退出即可。

#include<bits/stdc++.h>
using namespace std;
const int INF=1<<25;
int t,n,m,k,a[25][25],dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},ans;
int vis[25][25][25];
bool in(int x,int y){ return x>=1&&x<=m&&y>=1&&y<=n; }
int dfs(int x,int y,int len,int kk)
{
    if(x==m&&y==n)return len;
    for(int i=0;i<4;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];
        int cnt=kk;
        if(a[xx][yy]) cnt++;
        else cnt=0;
        if(in(xx,yy)&&(vis[xx][yy][cnt]<0 || vis[xx][yy][cnt]>len+1)&&cnt<=k)
        {
             vis[xx][yy][cnt]=len+1;
            ans=min(ans,dfs(xx,yy,len+1,cnt));
        }
    }return ans;
}
int main()
{
    cin>>t;
    while(t--)
    {
        memset(vis,-1,sizeof(vis));
           ans=INF;
        cin>>m>>n>>k;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
            cin>>a[i][j];
        ans=dfs(1,1,0,0);
        if(ans!=INF) printf("%d\n",ans);
        else printf("-1\n");
    }
}

 

posted @ 2020-10-05 14:12  徒手拆机甲  阅读(112)  评论(0)    收藏  举报