【搜索与回溯算法】保卫农场(DFS)
【搜索与回溯算法】保卫农场 (Standard IO)
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述:
农夫John的农场里有很多小山丘,他想要在那里布置一些保镖去保卫他的那些相当值钱的奶牛们。
他想知道如果在一座小山丘上布置一名保镖的话,他总共需要招聘多少名保镖。他现在有一个用数字矩阵来表示地形的地图。这个矩阵有N行(1 < N < = 100)和M列( 1 < M < = 70) 。矩阵中的每个元素都有一个值H_ij(0 < = H_ij < =10,000)来表示该地区的海拔高度。
小山丘的定义是:若地图中一个元素所邻接的所有元素都比这个元素高度要小或等于(或它邻接的是地图的边界),则该元素和其周围所有按照这样顺序排列的元素的集合称为一个小山丘(本题某个非边界点跟它相邻的有8个点:上、下、左、右、左上、右上、左下、右下)。输入:
第1行:两个由空格隔开的整数N和M;
第2行到第N+1行:
第I+l行描述了地图上的第I行,有M个由空格隔开的整数:H_ij。输出:
一个整数,表示小山丘的个数。
样例输入:
8 7 4 3 2 2 1 0 1 3 3 3 2 1 0 1 2 2 2 2 1 0 0 2 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 0 0 1 2 2 1 1 0 0 1 1 1 2 1 0样例输出:
3
思路:没什么好讲的,总之就是用DFS思想
AC代码(给CSDN用户):
#include<bits/stdc++.h>
using namespace std;
int dx[]= {-1,-1,-1, 0, 0, 1, 1, 1};
int dy[]= {-1, 0, 1,-1, 1,-1, 0, 1};
int n,m,flag;
int v[710][710],a[710][710];
int check(int i, int j)
{if(i>=0&&i<n&&j>=0&&j<m)return 1;return 0;
}
void dfs(int i,int j)
{int x,y;for(int k=0; k!=8; ++k){x=i+dx[k];y=j+dy[k];if (check(x,y)){if (a[x][y]>a[i][j])flag = 0;if (v[x][y]==0&&a[x][y]==a[i][j]){v[x][y] = 1;dfs(x,y);}}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=0; i!=n; ++i){for (int j=0; j!=m; ++j){scanf("%d",&a[i][j]);v[i][j]=0;}}int ans=0;for(int i=0; i!=n; ++i) {for(int j=0; j!=m; ++j){if(a[i][j]&&!v[i][j]){flag=1;dfs(i,j);ans+=flag;}}}cout<<ans;return 0;
}
AC代码(给游客、白嫖者):
#include<bits/stdc++.h>
using namespace std;
int dx[]= {-1,-1,-1, 0, 0, 1, 1, 1};
int dy[]= {-1, 0, 1,-1, 1,-1, 0, 1};
int n,m,flag;
int v[710][710],a[710][710];
int check(int i, int j)
{
if(i>=0&&i<n&&j>=0&&j<m)
return 1;
return 0;
}
void dfs(int i,int j)
{
int x,y;
for(int k=0; k!=8; ++k)
{
x=i+dx[k];
y=j+dy[k];
if (check(x,y))
{
if (a[x][y]>a[i][j])
flag = 0;
if (v[x][y]==0&&a[x][y]==a[i][j])
{
v[x][y] = 1;
dfs(x,y);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0; i!=n; ++i)
{
for (int j=0; j!=m; ++j)
{
scanf("%d",&a[i][j]);
v[i][j]=0;
}
}
int ans=0;
for(int i=0; i!=n; ++i)
{
for(int j=0; j!=m; ++j)
{
if(a[i][j]&&!v[i][j])
{
flag=1;
dfs(i,j);
ans+=flag;
}
}
}
cout<<ans;
return 0;
}
【搜索与回溯算法】保卫农场(DFS)相关推荐
- LeetCode-题目详解(十一):回溯算法【递归回溯、迭代回溯】【DFS是一个劲往某一个方向搜索;回溯算法建立在DFS基础之上,在搜索过程中,达到结束/裁剪条件后,恢复状态,回溯上一层,再次搜索】
这里写目录标题 一.概述 1.深度优先遍历(DFS) 和回溯算法区别 2. 何时使用回溯算法 3.回溯算法步骤 4.回溯问题的类型 二.LeetCode案例 39. 组合总和 40. 组合总和II 7 ...
- Nuist集训队作业:深度优先搜索(回溯算法)
Nuist集训队第一次作业:深度优先搜索(回溯算法) 引例 深搜基本思想及回溯算法模板 P1706 全排列问题 P1219 八皇后 P1605 迷宫 P1101 单词方阵 小结 引例 国际西洋棋棋手马 ...
- 搜索与回溯算法之—自然数的拆分
一.问题描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和. 当n=7共14种拆分方法: 输入:n 输出:按字典序输出具体方案 输入样例 ...
- 搜索与回溯算法:DFS(深度优先搜索)
深度优先搜索:1.确定回溯终止条件2.重复生成其他可能 今天开始改用JavaScript 我的LeetCode题解: 力扣,剑指 Offer 12. 矩阵中的路径 力扣,剑指 Offer 13. 机器 ...
- leetcode79. 单词搜索(回溯算法)
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字 ...
- 【搜索与回溯算法】泡泡龙
题目描述 这是一个简化版的网络游戏:在一个N×N方块构成的棋盘中,每个方块均涂上红.黄.蓝.绿(记为l.2.3.4)中的一种颜色,游戏者可以在最底行任意找一个方块,用鼠标双击这个方块,于是该方块及与之 ...
- 剑指offer 64.68Ⅰ.68Ⅱ. 搜索与回溯算法(中等)
64. 题目: 剑指 Offer 64. 求1+2+-+nhttps://leetcode-cn.com/problems/qiu-12n-lcof/ 想法:使用递归.但是终止递归需要if,能不能不用 ...
- 搜索与回溯典型题目解析
前排提示,本文收录的题目不是全部,只是抽取一些题目进行解析.因为笔者是在写完所有题之后在写此篇,推导过程中的量的名称可能与参考代码中不一样,还望谅解. 题目链接:信息学奥赛一本通(C++版)在线评测系 ...
- 力扣93 - 复原IP地址【回溯算法】
回溯算法解决字符串分割问题 一.题目分析 题目描述 思路分析 二.代码的细究与详解 回溯三部曲 三.相似题目 四.总结与提炼 一.题目分析 原题链接 题目描述 有效 IP 地址 正好由四个整数(每个整 ...
最新文章
- MySql 之 left join 避坑指南
- VS2005设计智能客户端(二)使用clickonce部署应用程序
- python常见的数据转化函数
- Flutter 实例 - 加载更多的ListView
- ubuntu18.04错误配置变量环境导致无法进入系统
- 基于sklearn的朴素贝叶斯_Sklearn参数详解—贝叶斯
- OpenCV之cvSmooth函数平滑滤波
- (转)基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录...
- 翁恺老师C语言学习笔记(十一)字符串_字符串常量
- middleware什么意思_middleware
- 使用FileZilla搭建简单的FTP
- hihoCoder #1117 战争年代
- Android 使用反射调用StorageManager中 Hide方法getVolumeList、getVolumeState
- 黄永成-thinkphp讲解-个人博客讲解26集
- 火狐受信任站点设置_火狐浏览器如何添加信任站点?添加信任站点的方法说明...
- 从 MVC 到使用 ASP.NET Core 6.0 的最小 API
- Android蓝牙通讯
- Eighth Week's ARST
- 怎么搭建百度网盘目录搜索网站?网盘目录#百度网盘
- 关于常见的RuntimeException