算法该怎么用呢
来源:互联网 发布: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
- 算法该怎么用呢
- 我该怎么调试呢??
- csdn该怎么用才是最好的呢?
- 该怎么研究Buro的论文呢?
- 这个控件该怎么做呢?
- 我该怎么换取积分呢?
- tomcat报错,该怎么解决呢?
- 稳压器,正常该怎么使用呢?
- 具体该怎么来实现呢
- 硬盘文件丢失该怎么解决呢?
- 批处理是什么?该怎么建立批处理文件呢?
- Java初学者该怎么学习Java呢?
- linux免费视频究竟应该怎么找?该怎么看呢?
- 程序该怎么学?拿来就用,还是深入些呢?
- 恳求各位告诉我我该怎么选择呢?
- 不会编程该怎么成立初创公司呢?
- 该怎么恢复断电丢失的文件呢
- 找不到移动硬盘的文件该怎么恢复呢
- 数据结构基础(C语言版)(朱仲涛翻译)代码学习 第一章001
- SVN的trunk branch tag
- 《Android源码设计模式解析与实战》读书笔记(九)
- 升级xcode7系列版本插件失效问题
- android 实现图片旋转,移动,缩放,并且记录变化值,用另外一张图片显示出来
- 算法该怎么用呢
- Android Activity学习
- 一大代表简单介绍
- Java中httpClient中三种超时设置
- 数论欧拉函数
- 邮件发送 API
- 巧妙的邻接表(数组实现)
- Windows Server 2003 + SQL Server 2000 + Outlook 2003
- android获取热点主机ip和连接热点手机ip