【HDOJ】1241 Oil Deposits

本文介绍了一种经典的广度优先搜索(BFS)算法实现方法,通过C语言代码详细展示了如何在一个二维字符数组中进行搜索,并标记已访问的位置,避免重复访问。该算法适用于寻找连通区域,例如岛屿数量等问题。

经典的BFS。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define MAXNUM 105
 5 #define MAXROW 105
 6 #define MAXQUE 10005
 7 
 8 char buf[MAXROW][MAXNUM];
 9 char visit[MAXROW][MAXNUM];
10 
11 typedef struct {
12     int x, y;
13 } pos_st;
14 
15 pos_st queue[MAXQUE];
16 int direct[8][2] = {{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};
17 int m, n;
18 int total;
19 
20 void bfs();
21 void search();
22 
23 int main() {
24     int i;
25 
26     while (scanf("%d%d", &m, &n)!=EOF && (m||n)) {
27         getchar();
28         for (i=0; i<m; ++i) {
29             gets(buf[i]);
30         }
31         bfs();
32         printf("%d\n", total);
33     }
34 
35     return 0;
36 }
37 
38 void bfs() {
39     int i, j;
40 
41     total = 0;
42     memset(visit, -1, sizeof(visit));
43 
44     for (i=0; i<m; ++i)
45         for (j=0; j<n; ++j)
46             if (buf[i][j]=='@' && visit[i][j]==-1)
47                 search(i, j);
48 }
49 
50 void search(int row, int col) {
51     int front, rear;
52     int x, y, newx, newy;
53     int i;
54 
55     front = rear = 0;
56     total++;
57     visit[row][col] = total;
58 
59     if (visit[row][col] > 0) {
60         queue[rear].x = row;
61         queue[rear].y = col;
62         rear++;
63         while (front != rear) {
64             x = queue[front].x;
65             y = queue[front].y;
66             front++;
67             for (i=0; i<8; ++i) {
68                 newx = x+direct[i][0];
69                 newy = y+direct[i][1];
70                 if (newx>=0 && newx<m && newy>=0 && newy<n) {
71                     if (buf[newx][newy] == '@' && visit[newx][newy]<0) {
72                         queue[rear].x = newx;
73                         queue[rear].y = newy;
74                         rear++;
75                         visit[newx][newy] = total;
76                     }
77                 }
78             }
79         }
80     }
81 
82 }
View Code

 

转载于:https://www.cnblogs.com/bombe1013/p/3604736.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值