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

【伪一周小结(没错我一周就做了这么点微小的工作)】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.

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