HDU1241 DFS

 1 #include <iostream>
 2 #include <cstdio>
 3 #define pf(x) printf("%d\n", x)
 4 using namespace std;
 5 const int MAX = 105;
 6 char oil[MAX][MAX];
 7 int Move[8][2]= {{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
 8 int m, n, ans;
 9 void DFS(int x, int y);
10 int main()
11 {
12     int i, j;
13     while(scanf("%d%d", &m, &n) != EOF, m || n)
14     {
15         ans = 0;
16         for(i = 0; i < m; i++)
17             scanf("%s", oil[i]);
18         for(i = 0; i < m; i++)
19             for(j = 0; j < n; j++)
20             {
21                 if(oil[i][j] == ‘@‘)//判断有无油田
22                 {
23                     oil[i][j] = ‘*‘;//标记该点已经走过
24                     ans++;
25                     DFS(i, j);//遍历的次数,一次则代表有一窝
26                 }
27             }
28         pf(ans);
29     }
30     return 0;
31 }
32 void DFS(int x, int y)
33 {
34     int i;
35     for(i = 0; i < 8; i++)
36     {
37         int xx = x + Move[i][0];
38         int yy = y + Move[i][1];
39         if(xx>=0 && xx<m && yy>=0 && yy<n && oil[xx][yy]==‘@‘)//判断是否超出地图边界和是否可行
40         {
41             oil[xx][yy] = ‘*‘;//标记已经走过的点
42             DFS(xx,yy);//以此点为起点继续深入搜索,这就是深度优先搜索
43         }
44     }
45 }

若使用used[i][j]标记所走过的路径,则不方便(且需要注意if()语句中的条件)

#include <iostream>
#include <cstdio>
#include <cstring>
#define pf(x) printf("%d\n", x)
using namespace std;
const int MAX = 105;
char oil[MAX][MAX];
int used[MAX][MAX];
int Move[8][2]= {{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};
int m, n, ans;
void DFS(int x, int y);
int main()
{
    int i, j;
    while(scanf("%d%d", &m, &n) != EOF, m || n)
    {
        ans = 0;
        memset(used, 0, sizeof(used));
        for(i = 0; i < m; i++)
            scanf("%s", oil[i]);
        for(i = 0; i < m; i++)
            for(j = 0; j < n; j++)
            {
                if(!used[i][j] && oil[i][j] == ‘@‘)//判断有无油田
                {
                    used[i][j] = 1;//标记该点已经走过
                    ans++;
                    DFS(i, j);//遍历的次数,一次则代表有一窝
                }
            }
        pf(ans);
    }
    return 0;
}
void DFS(int x, int y)
{
    int i;
    for(i = 0; i < 8; i++)
    {
        int xx = x + Move[i][0];
        int yy = y + Move[i][1];
        if(!used[xx][yy] && xx>=0 && xx<m && yy>=0 && yy<n && oil[xx][yy]==‘@‘)//判断是否超出地图边界和是否可行
        {
            used[xx][yy] = 1;//标记已经走过的点
            DFS(xx,yy);//以此点为起点继续深入搜索,这就是深度优先搜索
        }
    }
}

  

时间: 2024-12-28 04:04:45

HDU1241 DFS的相关文章

Oil Deposits hdu-1241 DFS

The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyze

HDU1241&amp;POJ2386 dfs简单题

2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的思路,分析清楚dfs的退出递归的条件和什么时候进行递归调用是至关重要的,这两道题目不涉及回溯,对于需要回溯的题目也要清楚分析,找到回溯条件,在对一个新的状态dfs时,后面加上回溯的语句 HDU1241代码: 1 #include <cstdio> 2 #include <cstring>

HDU1241 Oil Deposits(dfs+连通块问题)

背景描述 ztw同志负责探测地下石油储藏.ztw现在在一块矩形区域探测石油.他通过专业设备,来分析每个小块中是否蕴藏石油.如果这些蕴藏石油的小方格相邻(横向相邻,纵向相邻,还有对角相邻),那么它们被认为是同一油藏的一部分.在这块矩形区域,可能有很多油藏.你的任务是确定有多少不同的油藏. 输入 输入可能有多个矩形区域(即可能有多组测试).每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m=0表示输入的结束,接下来是n行,每行m个字符.每个字符对应一个小方格,并且要么

hdu1241

英语太菜,罚自己翻译题目: GeoSurvComp地质调查公司负责探测地下石油储量.GeoSurvComp公司在一段时间内在一大块矩形区域内工作,创造出一个网格把土地分成很多方块.如果每一方块单独分析,使用感应设备去测定方块中是否含有石油.含有油的方块称为口袋.如果两个口袋是相邻的,那它们属于同一个油床.油床可以相当大,可以包含众多口袋.你的任务就是测定出有多少不同的油床. 输入: 输入文件包括一个或多个网格.每一个网格输入的第一行含有m和n,分别代表网格的横坐标和纵坐标,被一个空格分开.如果m

解救小哈——DFS算法举例

一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二.问题的分析 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向. 在这里我们规定一

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <stack> 8 #include <cctype> 9 #include <str

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000