算法该怎么用呢

上周没有怎么刷题,感觉整个人都变水了。
今天写了一个水题,然而,我意识到了自己是有多么水,感觉自己完全没有脱离初学者的程度。然而q神一年都快进final了,想想自己,真的是渣渣。
题外话不多说了,就讲讲这道题吧
http://codeforces.com/contest/540/problem/C
div2 的C 题,写了一大堆dfs,bfs卡得一塌糊涂,
题意就是从起点走到终点,但是很快冰若是“.”走过之后变成“X”,走到X上才会掉下去,而最终要求的就是从终点上面掉下去,这意味着先要走过两次终点,而且不能在途中掉下去。
然而读懂题,就开始写dfs,bfs然后开始考虑各种情况,这里那里的,然后就开始卡住,开始不知道怎么写。 说到底,还是思维太菜,写了将近一百行 代码自己都感觉自己还有错误。
看别人的代码,别人在这种题上根本想都没怎么想,简简单单一个回溯就搞定了,10行代码写完的都有!
瞬间感觉自己真的好菜,好水。 学了一大堆自己所谓的算法,但其实很多时候根本不知道真正地去用。算法首先就没有学透,尽管我自己不太愿意承认这个事实,但是这次一个回溯就看出来了。
dfs写过很多了,但是很多时候dfs都拘泥于那种模板上的格式。
其实,我感觉自己现在要做的就是透过算法——看到真正意义上的模板中想要表达的思想本质。
贴一段别人写这题的算法:

int R,C;
char a[502][502];
int rr[4]={1,0,-1,0},cc[4]={0,1,0,-1};

int go(int r,int c) {
    if (r==R&&c==C&&a[r][c]=='X') return 1;
    if (a[r][c]!='.') return 0;
    a[r][c]='X';
    int i;
    for (i=0;i<4;i++)
        if (go(r+rr[i],c+cc[i])) return 1;
    return 0;
}

int main() {
    int n,m;
    scanf("%d %d\n",&n,&m);
    int i;
    for (i=1;i<=n;i++)
        scanf("%s",1+a[i]);
    int r,c;
    scanf("%d %d\n",&r,&c);
    a[r][c]='.';
    scanf("%d %d\n",&R,&C);
    printf("%s\n",go(r,c)?"YES":"NO");
    return 0;
}

简简单单的回溯,但是真的很有效,我如果真的完全掌握了回溯,那么这种题为什么不能一眼看出来呢?首先就是,算法拘泥于模板,没看到本质,其次就是可能一周没做题,思维一下子就傻逼了。
加油吧 the way so far!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值