# DFS-BZOJ-1619-[Usaco2008 Nov]Guarding the Farm 保卫牧场

Description

The farm has many hills upon which Farmer John would like to place guards to ensure the safety of his valuable milk-cows. He wonders how many guards he will need if he wishes to put one on top of each hill. He has a map supplied as a matrix of integers; the matrix has N (1 < N <= 700) rows and M (1 < M <= 700) columns. Each member of the matrix is an altitude H_ij (0 <= H_ij <= 10,000). Help him determine the number of hilltops on the map. A hilltop is one or more adjacent matrix elements of the same value surrounded exclusively by either the edge of the map or elements with a lower (smaller) altitude. Two different elements are adjacent if the magnitude of difference in their X coordinates is no greater than 1 and the magnitude of differences in their Y coordinates is also no greater than 1.

Input

• Line 1: Two space-separated integers: N and M

• Lines 2..N+1: Line i+1 describes row i of the matrix with M space-separated integers: H_ij
Output

• Line 1: A single integer that specifies the number of hilltops

Sample Input
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

Sample Output
3

HINT

//
//  main.cpp
//  搜索3
//
//  Created by 袁子涵 on 17/2/25.
//

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <stack>
using namespace::std;
const int maxn=1005;
int n,m,maze[maxn][maxn];
int mv[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
typedef struct node
{
int x,y,h;
bool operator <(const node &r)const
{
return h>r.h;
}
}node;
node maze1[maxn*maxn];
bool vis[maxn][maxn];
bool check(int x,int y)
{
if (x<0 || x>=n || y<0 || y>=m)
return 0;
return !vis[x][y];
}
void dfs(int x,int y)
{
vis[x][y]=1;
for (int i=0; i<8; i++) {
int tmpx=x+mv[i][0],tmpy=y+mv[i][1];
if (check(tmpx, tmpy) && maze[tmpx][tmpy]<=maze[x][y])
dfs(tmpx, tmpy);
}
return;
}
int main(int argc, const char * argv[]) {
int ans=0,total=0,now=0,x,y;
cin >> n >> m;
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
{
cin >> maze[i][j];
maze1[total].x=i,maze1[total].y=j;
maze1[total].h=maze[i][j];
total++;
}
sort(maze1+0, maze1+total);
x=maze1[0].x,y=maze1[0].y;
while (now!=total) {
ans++;
dfs(x,y);
while (vis[maze1[now].x][maze1[now].y] && now<total) {
now++;
}
x=maze1[now].x,y=maze1[now].y;
}
cout << ans << endl;
return 0;
}

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m,maze[1005][1005];
typedef struct node
{
int x,y,z;
bool operator <(const node &r)const
{
return z>r.z;
}
}node;
int tmpx,tmpy;
int moved[8][2]= {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
bool check(int x,int y)
{
if(x<0 || x>=n || y<0 || y>=m)
return 0;
return 1;
}
bool vis[1005][1005];
int main()
{
cin >> n >> m;
long long int out=0,now=0;
vector<node>Node;
node tmp;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
scanf("%d",&maze[i][j]);
Node.push_back(node{i,j,maze[i][j]});
}
queue<node>q;
sort(Node.begin(),Node.end());
tmp=Node[0];
vis[tmp.x][tmp.y]=1;
q.push(tmp);
now++;
while(tmp.x!=n)
{
out++;
while(!q.empty())
{
tmp=q.front();
q.pop();
for(int i=0; i<8; i++)
{
tmpx=tmp.x+moved[i][0],tmpy=tmp.y+moved[i][1];
if(check(tmpx,tmpy))
if(maze[tmpx][tmpy]<=tmp.z && maze[tmpx][tmpy]!=0 && vis[tmpx][tmpy]==0)
{
q.push(node{tmpx,tmpy,maze[tmpx][tmpy]});
vis[tmpx][tmpy]=1;
}
}
}
tmp.x=n;
for(long long int i=now;i<n*m;i++)
{
if(vis[Node[i].x][Node[i].y]==0)
{
if(Node[i].z==0)
break;
tmp=Node[i];
now=i;
break;
}
}
q.push(tmp);
vis[tmp.x][tmp.y]=1;
}
cout << out << endl;
return 0;
}

04-29 284

12-17 53
07-18 823
10-11 177
03-20 5854
09-05 27
12-18 94
07-19 126
09-07 70
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客