【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版

2016 11月最后一周

这一周复习了一下目前大概了解的唯一算法——深度优先搜索算法(DFS)。
关于各种细节的处理还是极为不熟练,根据题意判断是否还原标记也无法轻松得出结论。
不得不说,距离一个准ACMer我都有相当差距,这条路是否能行通也无从得知。
明天就是新生赛了,GG的时候即将到来。。。但无论成功失败,我也不是抱着争些什么,
证明自己之类的想法而在志愿的每一项都填上计算机还不调剂结果滑进二本的对吧(并且并不是很后悔),
还是那句话,他强任他强,走好自己的路就好。
菜鸟一思考,大佬就发笑,但若作为菜鸟还不思考,那估计永远是一个菜鸟。

嗯,这周初终于拿出了垫laptop的《啊哈!算法》开始看起来。
书是本好书,非常适合我这种小学生水平的选手,反正我现在终于理解quicksort到底是个怎样的原理了。。。
看完桶、冒泡、快速三种排序,我就直接跳到了深度优先搜索算法这一章,感觉看书还是比瞎JB学好一点,
它的模板也比我之前写的明晰、好看多了。
(关于新的模板http://www.cnblogs.com/ray-coding-in-rays/p/6127150.html)

过了几段示例题代码之后,我决定找HDOJ那道我唯一写出的简单DFS题
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题意大致就是将矩形区域中有多少个@组成的区域,*为隔开的符号

,用新的模板重新写一遍,然后我就发现自己快啥都忘记了。。。
反正一番挣扎之后终于搞出来了。

第一次做,我的AC代码是这样子的:

 1 #include<stdio.h>
 2 #define MAXN 100
 3
 4 char map[MAXN][MAXN];
 5
 6 void dfs(int,int);
 7
 8 int main(void)
 9 {
10     int length,width;
11     int i,j;
12     int count;
13     while(~scanf("%d %d",&length,&width))
14     {
15         count=0;
16         if(length==0) break;
17           for(i=0;i<length;i++)
18             for(j=0;j<=width;j++)
19             {
20                 scanf("%c",&map[i][j]);
21             }
22         for(i=0;i<length;i++)
23             for(j=0;j<width;j++)
24             {
25                 if(map[i][j]==‘@‘)
26                 {
27                     dfs(i,j);
28                     count++;
29                 }
30             }
31         printf("%d\n",count);
32     }
33
34     return 0;
35 }
36
37 void dfs(int x,int y)
38 {
39     if(map[x][y]==‘@‘)
40     {
41         map[x][y]=‘*‘;
42         dfs(x+1,y);
43         dfs(x,y+1);
44         dfs(x-1,y);
45         dfs(x,y-1);
46         dfs(x+1,y+1);
47         dfs(x+1,y-1);
48         dfs(x-1,y-1);
49         dfs(x-1,y+1);
50     }
51     else
52         return;
53 }

感觉太粗糙了。。。 ,那么框架重构之后:

 1 #include <stdio.h>
 2
 3 char map[100][100];
 4 int width, lenth;
 5 //这里定义一个数组,用来表示检索点的移动
 6 int move[8][2] = {
 7     { 1,0 },{ 0,1 },{ -1,0 },{ 0,-1 },
 8     { 1,1 },{ 1,-1 },{ -1,-1 },{ -1,1 }
 9 };
10 void DFS(int x, int y)
11 {
12     int k, tx, ty;
13
14     for (k = 0; k < 8; k++) // 8种移动方式
15     {
16         tx = x + move[k][0];
17         ty = y + move[k][1];
18         // 检查是否合法
19         if (tx<0 || ty<0 || tx >= lenth || ty >= width) continue;
20         if (map[tx][ty] == ‘*‘) continue;
21         if (map[tx][ty] == ‘@‘)
22         {
23             // 将其标记为非目标状态
24             map[tx][ty] = ‘*‘;
25             DFS(tx, ty);
26             // 注意,此处无需还原标记实现回溯
27         }
28     }
29     return;
30 }
31
32 int main(void)
33 {
34     int i, j, count;
35     while (~scanf("%d %d", &lenth, &width))
36     {
37         count = 0;
38         if (lenth == 0) break;
39         for (i = 0; i<lenth; i++)
40             // 这里是一个小改进,逐行读入字符串就不用担心末尾回车的问题了
41             scanf("%s", map[i]);
42         for (i = 0; i<lenth; i++)
43             for (j = 0; j < width; j++)
44             {
45                 if (map[i][j] == ‘@‘)
46                 {
47                     DFS(i, j);
48                     count++;
49                 }
50             }
51         printf("%d\n", count);
52     }
53     return 0;
54 }

嗯,感觉好多了,that’s all.

时间: 2024-08-28 03:15:20

【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版的相关文章

一周小结

1.对象.属性.方法的调用不够熟悉,导致代码的编写存在很大问题,需恶补 2.数组在使用时,对数组的属性.下标不够熟悉 一周小结,布布扣,bubuko.com

Alpha版本第一周小结

Alpha版本第一周小结 姓名 学号 周前计划安排 每周实际工作记录 自我打分 QCY 061313 撰写博客,选择原型开发工具,APP界面模板设计 选择墨刀作为原型设计工具,APP界面参考了知乎,淘宝等App的界面 90 PWJ 061312 注册登录模块中,登录子模块的具体设计和实现,接口设计和实现 登录模块中需要交互的部分比较多,需要实际用户来使用才能实现,用原型比较难做,只做了基础的登录界面和一个修改密码功能 89 CYH 082405 注册登录模块中,注册子模块的具体设计,模块接口设计

6.10周小结

这周我们终于进入到了数据库的学习,在学习之前对数据库是一个陌生的,不知道数据库所指的是什么,是数据吗.还是数据的集合,在学习了之后,才知道数据就是将我们所有的数据放到一个结合当中进行批量的管理.虽然对数据库这门语言有点陌生,但是就是由于这一种陌生,对这门语言充满着好奇,但是学习之后,发现其实并不神奇,也就是对数据进行增加.删除.修改和查找,特别是在查找功能的学习中,花了很大的精力去学习,因为数据的查找在以后的开发过程中会用到很多.

第一周小结

2015年10月15    第一周 本周学习重点归纳 PS(CS6) AXURE MarkdownPad2 Mark Man notepad++ PS 快捷键 "Ctrl"+"Alt"+"Z"回退Ctrl+O 打开文件 Ctrl Ait+Z 回退多步 Shift+鼠标左键 图片正中间 Shift 重合内部 Alt 去除外部 Ctrl+D 取消选区 Ctrl+T 自由变换 Ctrl+Delete 填充前景色 Alt+Delete 填充背景色 Ctr

6.18周小结

从上周开始接触到数据库之后,到这周就对数据库慢慢的有了更深的了解和使用学习.在这周就学习到了数据库更高级的与java代码进行链接的操作.比如说通过编写java代码来对数据库进行增加的操作,在操作数据库之前,首先要在代码中打开数据库与java的连接,比如这里"jdbc:mysql://localhost:3306/homework?characterEncoding=utf-8",其中只有homework这个地方是需要对数据库进行更改的,其他都是固定的数据库格式. 在java对数据库的操

6.23周小结

其实在本周的学习中,基本没有其他新的知识,因为这周都一直在做系统的项目,就是在吧以前的知识现在可以综合的用起来的时候了. 在本次项目之中,虽然没有能很好的完成项目系统的所有功能和项目的结果,但是在这个过程中学习到了很多东西,学习到的不只是仅限于是代码知识范围内的东西,更多的学习到的是在实际项目开发的操作过程中的流程和技巧方法. 通过做项目才发现在学习基础知识的过程中,不仅仅是将基础知识用在基础的应用之中,更需要把所学习的知识运用到更实际的项目当中去,只有通过对项目的参与编写,才会发现自身的不足之

5.28周小结

在本周的学习中,学习到了AWT的GUI方面的知识,在这个方面的知识中,终于稍微感觉有一点开始有一些乐趣了,这是为什么呢,是因为之前都是比较枯燥的一些学习,到这周学习中,就开始用图形界面设计一些自己喜欢的界面出来了,这样就可以进行一些有趣的操作,比如做一些图形界面出来,做一些简单的软件界面出来,其中还有一些功能都是可以去实现的,这样也可以更好的将我们所学的知识更好的运用到实际化的操作中去.

一周小结(2016-05-09~2016-05-13)

经过了两周的相处,现在基本上和大家能正常的沟通了.余哥经常对我说,我的交流范围太小了,不能局限在自己小组,应该到其他组去交流.让我带着问题去问问他们,这样自然就熟了.原来我是这么认为的,感觉麻烦他人不是很好,特地跑得好远去问别人感觉有点奇怪.后来我理解了,个人的知识是有限的,个人的理解也是不同的,同一个问题不同的人解释肯定不一样,其实好像你只问了一个问题,但是其中的收获可能就是不是一个了.让你有更广的视野.这可能就是多问的好处吧! 但是我觉的先要做到这么几点去问问题,才能达到更好的效果.1.对这

C++课程第一周小结

本周C++课程共布置了三个作业,分别是: 1.编程求两数的和并输出.要求:从键盘输入两个整数,求出两数的和,并在屏幕输出. 2.编程输出 a.文字:hello,gdufs! b.一个有字母或字符组成的自定义图案. 代码:https://github.com/524868939/Homework 程序分析:本周作业都挺简单,作业1是在课本上有相似例题,作业2.a在老师文档里有示例,作业2.b仅需在作业2.a的基础上变动. 过程:虽然作业简单,但是也遇到问题,第一个问题是完成作业1时,我虽参照了课本