LOJ P2653 山峰和山谷 Ridges and Valleys 题解

每日一题 day70 打卡

Analysis

这道题的突破口是每个山峰或山谷上的高度是相同的,根据这点我们就可以用广搜来解决。

这样我们基本的思路就是广搜从每个点开始,搜它能走到的高度相同的格子,且将它标记为走过,这样我们就可以在时间范围内遍历整个图了。

但是如何判断当前遍历的连通块是否是山峰还是山谷呢?(要知道并不是每一个连通块都是山峰或山谷)

我们可以通过当前遍历的且是非当前连通块的点与连通块高度比较,连通块高度高则有可能是山峰,反之亦然。

只有这个也不能确定,我们需要在广搜后再加一个判断,如果搜完的连通块既有可能是山峰,也有可能是山谷,那它既不是山峰,也不是山谷。

以下是代码实现:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #define int long long
 7 #define maxn 1010
 8 #define rep(i,s,e) for(register int i=s;i<=e;++i)
 9 #define dwn(i,s,e) for(register int i=s;i>=e;--i)
10 using namespace std;
11 inline int read()
12 {
13     int x=0,f=1;
14     char c=getchar();
15     while(c<'0'||c>'9') {if(c=='-') x=-x; c=getchar();}
16     while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
17     return f*x;
18 }
19 inline void write(int x)
20 {
21     if(x<0){putchar('-');x=-x;}
22     if(x>9)write(x/10);
23     putchar(x%10+'0');
24 }
25 int n,ans1,ans2;
26 int map[maxn][maxn];
27 int book[maxn][maxn];
28 int dx[10]={0,0,0,1,-1,1,1,-1,-1},dy[10]={0,1,-1,0,0,1,-1,1,-1};
29 struct node
30 {
31     int x,y;
32 }point[maxn];
33 queue<node> q;
34 void bfs(int sx,int sy) 
35 {
36     int flag1=0,flag2=0;
37     q.push((node){sx,sy});
38     while(!q.empty())
39     {
40         node now=q.front();
41         q.pop();
42         rep(i,1,8)
43         {
44             node af;
45             af.x=now.x+dx[i];
46             af.y=now.y+dy[i];
47             if(af.x<1||af.y<1||af.x>n||af.y>n) continue;
48             if(book[af.x][af.y]==0&&map[sx][sy]==map[af.x][af.y])
49             {
50                 book[af.x][af.y]=1;
51                 q.push(af);
52             }
53             else if(map[sx][sy]>map[af.x][af.y]) flag1=1;
54             else if(map[sx][sy]<map[af.x][af.y]) flag2=1;
55         }
56     }
57     if(flag1==1&&flag2==0) ++ans1;
58     if(flag2==1&&flag1==0) ++ans2;
59 }
60 signed main()
61 {
62     n=read();
63     rep(i,1,n)
64         rep(j,1,n)
65             map[i][j]=read();
66     int s=map[1][1],cnt=0;
67     rep(i,1,n)
68         rep(j,1,n)
69             if(map[i][j]==s) ++cnt;
70     if(cnt==n*n)
71     {
72         write(1);
73         putchar(' ');
74         write(1);
75         return 0;
76     }
77     rep(i,1,n)
78         rep(j,1,n)
79             if(book[i][j]==0)
80                 bfs(i,j);
81     write(ans1);
82     putchar(' ');
83     write(ans2);
84     return 0;
85 }

如有失误请各位大佬斧正(反正我不认识斧正是什么意思)

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/12381639.html
今日推荐