【UVa】1600 Patrol Robot(dfs)

题目

题目
?



?

分析

bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T
?



?

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF=1<<25;
int k,n,m,map[25][25],dx[10]={1,-1,0,0},dy[10]={0,0,1,-1},ans;
int vis[25][25][25];
bool in(int x,int y){ return x>=1&&x<=n&&y>=1&&y<=m; }
int dfs(int x,int y,int len,int p)
{
    int ans=INF;
    if(x==n && y==m) return len;
    for(int i=0;i<4;i++)
    {
        int px=x+dx[i],py=y+dy[i];
    //  printf("(%d,%d) -> (%d,%d)\n",x,y,px,py);
        int cnt=p;
        if(map[px][py]) cnt++;
        else cnt=0;
        if(in(px,py) && cnt<=k &&(vis[px][py][cnt]<0 || vis[px][py][cnt]>len+1))
        {
            vis[px][py][cnt]=len+1;
            ans=min(ans,dfs(px,py,len+1,cnt));
        }
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,-1,sizeof(vis));
        ans=INF;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&map[i][j]);
        ans=dfs(1,1,0,0);
        if(ans!=INF) printf("%d\n",ans);
        else printf("-1\n");

    }
}
时间: 2024-08-27 10:51:06

【UVa】1600 Patrol Robot(dfs)的相关文章

【UVa】439 Knight Moves(dfs)

题目 题目 ? ? 分析 没有估价函数的IDA...... ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int q,dx[10]={2,2,-2,-2,1,-1,1,-1},dy[10]={1,-1,1,-1,2,2,-2,-2},ans=1<<15; bool vis[11][11]; int x1,y1,x2,y2; bool

【UVA】11181 - Probability|Given(条件概率)

一道条件概率题,数学烂真的伤不起,一开始都不知道怎么求条件概率. P(e) = p(e|E)/p(E). 用e出现的情况的概率,除以所有情况出现的概率,递归枚举每个人是否买东西了. 14026058 11181 Probability|Given Accepted C++ 0.102 2014-08-12 08:25:51 效率可能有点差. #include<cstdio> #include<cstring> #include<iostream> #include<

【UVA】10404-Bachet&#39;s Game(动态规划)

如果d[i]是必胜态,那么d[i + V[j]]一定是必败态,反之亦然. 用d[i]代表棋子为i个是否为必胜态. 边界条件是d[i] = 1; 14139291 10404 Bachet's Game Accepted C++ 0.662 2014-09-03 09:44:48 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vecto

【UVA】10317 - Equating Equations(dfs + 剪枝)

真郁闷,一道普通的搜索题 我拿dp的方法去做,结果一直TLE和WA 如果所有数的和为奇数,肯定没有正解. 14133454 10317 Equating Equations Accepted C++ 0.102 2014-09-02 09:01:23 #include <iostream> #include <cstdlib> #include <cstdio> #include <string> #include <cstring> #incl

1600 - Patrol Robot(BFS)

BFS题,不过多了一个很有意思的条件:不能连续穿越K个障碍,就好像多了一个技能一样,我用pre[][]数组来记录目前的k值: #include<bits/stdc++.h> using namespace std; int a[30][30],T,m,n,k,d[30][30],pre[30][30],air[10]={1,0,-1,0},air2[10]={0,1,0,-1};; typedef pair<int,int> P; P s[450]; int bfs() { que

【UVA】11796 - Dog Distance(相对运动)

因为a,b是同时出发,同时达到,但是他们的速度不一定一样,所以我们可以设他们的速度为La,Lb(La,Lb为a,b狗的总路程) 那么,如何a,b都是沿着直线运动的时候如何求他们之间的最短最长距离呢? 因为运动都是相对的,所以我们可以把a看成不懂的,而b相对于a的移动方向就是Vb - Va,因此就可以看成a和线段 b + (Vb -Va)之间的关系了 至于方向Va,Vb向量怎么求,我们可以利用单位向量 X 移动时间 X 移动速度 得到. 经典的一道题,顺便还修复了一个模板的BUG: 1412818

【UVa】Partitioning by Palindromes(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=show_problem&problem=2549 设w[i,j]为i-j能分割成的最少回文串 f[i]为前i个字符能够分成的最少回文串 w[i,j]=1 当w[i+1,j-1]==1 && s[i]==s[j] 或 i==j-1 && s[i]==s[j] w[i,j]=

【UVa】1374 Power Calculus(IDA*)

题目 题目 ? ? 分析 IDA*大法好,抄了lrj代码. ? ? 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxans=14; int n,a[maxans+1]; bool dfs(int d,int maxd) { if(a[d] == n) return true; if(d == maxd) return false;

【UVA】247 - Calling Circles(floyd判断包闭,dfs输出)

最近状态不佳,总是爱犯低级错误,比较水的题,没什么需要讲得,要说的可能是floyd判断包闭吧 void Floyd() { for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(map[i][k]) for(int j=1; j<=n; j++) if(map[k][j]) map[i][j] = 1; } 之前做了不少图论,图论周感觉能应付的过去. 14059727 247 Calling Circles Accepted C++ 0.0