算法该怎么用呢

来源:互联网 发布:php mysql 上传视频 编辑:程序博客网 时间:2024/04/29 05:28

上周没有怎么刷题,感觉整个人都变水了。
今天写了一个水题,然而,我意识到了自己是有多么水,感觉自己完全没有脱离初学者的程度。然而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 0