POJ 2386 Lake Counting

http://poj.org/problem?id=2386

思路 将联通的W变为 . dfs的次数 就是pound的个数

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 const int maxsize = 128;
 8 int M,N,cnt = 0;
 9 int d[2][8] = { {-1, -1, -1, 0, 1, 1, 1, 0},
10                 {-1, 0, 1, 1, 1, 0, -1, -1},
11               };
12 char court[maxsize][maxsize];
13 
14 //思路 : 随机选择一个水点 然后深搜将周围的所有水点变为.直到没有W为止
15 //那么深搜的次数 就是pound的个数
16 bool check(int x, int y)
17 {
18     if (x < 0 || x >= M || y < 0 || y >= N) return false;
19     if (court[x][y] == '.') return false;
20     return true;
21 }
22 void dfs(int x, int y)
23 {
24     int nx, ny;
25     court[x][y] = '.';//将相邻的所有W置为.
26     for (int i = 0; i <8; i++)
27     {
28         nx = x+d[0][i];
29         ny = y+d[1][i];
30         if (check(nx,ny))
31         {
32             dfs(nx, ny);
33         }
34     }
35 }
36 
37 int main()
38 {
39     //POJ是不能这样滴
40    #ifndef OLINE_JUDGE
41    freopen("in.txt", "r", stdin);
42    #endif // OLINE_JUDGE
43 
44    while (~scanf("%d%d", &M, &N))
45    {
46        cnt = 0;
47        getchar();
48        for (int i = 0;i < M; i++)
49        {
50            gets(court[i]);
51        }
52        while (1)
53        {
54            int x, y, s = 0;
55            for (int i = 0; i < M; i++)
56            {
57                for (int j = 0; j < N; j++)
58                {
59                    if (court[i][j] == 'W')
60                    {
61                        s++;
62                        x = i;
63                        y = j;
64                    }
65                }
66            }
67            if (s == 0) break;
68            dfs(x,y);
69            //for (int i = 0; i < M; i++) printf("%s\n",court[i]);
70            //putchar('\n');
71            cnt++;//进行多少次dfs()就有多少个pound
72        }
73        /*
74        改进:书上代码 自己想得太多
75        for (int i = 0; i < M; i++)
76         for (int j = 0; j < N; j++)
77        {
78          if (court[i][j] == 'W')
79          {
80             dfs(i,j);
81             cnt++;
82          }
83        }
84 
85        */
86        printf("%d\n", cnt);
87    }
88    return 0;
89 
90 }
91 //时间复杂度 因为每个格子至多被访问一次 然后会想8个方向搜索 所以时间复杂度 O(8*M*N)

 

转载于:https://www.cnblogs.com/oscar-cnblogs/p/6291447.html

系统支持前后端分离架构,涵盖微信、支付宝、百度、头条等主流平台的小程序、APP及公众号,内置多种常见支付方式,具备完善的订单处理机制,界面设计美观,是一款功能完备的商城开源平台。毕业设计是高校教育中的一项关键实践性任务,用于评估学生在专业领域内的知识掌握程度、实践能力和创新思维。该任务通常要求学生结合所学理论,针对某一具体问题提出可行的解决方案或开展一项具有实际价值的研究项目。 在选题阶段,学生需根据个人兴趣、专业方向及现实需求进行选择,并在导师指导下明确研究目标与核心问题,制定研究计划与实施方案。整个过程通常包含资料查阅、需求分析、系统设计、开发实现及测试优化等多个环节,确保研究的完整性与科学性。 在研究过程中,学生需具备较强的自主分析与问题解决能力,可能通过实验、调研、案例研究等方式收集数据并验证假设,从而提升专业技能与实际操作能力。撰写毕业设计报告是核心环节之一,需详细记录研究过程、方法、结果及结论,以全面展示研究成果。同时,这一过程也有助于提升学生的学术表达能力与逻辑思维水平。 最终,毕业设计成果将由导师及相关专家进行评审,评价标准涵盖创新性、应用价值、研究方法的合理性及论文撰写质量等方面。毕业设计的成绩将作为学生学业评估的重要依据,直接影响其毕业资格与学位授予。 总体而言,毕业设计是高校教学体系中的重要组成部分,不仅有助于学生深化专业知识,还能锻炼其独立研究与实践能力,为未来职业发展奠定良好基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值