P2919 [USACO08NOV]守护农场Guarding the Farm
链接:P2919
-----------------------------------
一道非常暴力的搜索题
-----------------------------------
注意的是,我们要从高出往低处搜,所以要sort一边
然后没有什么值得成为绿题的部分了
绝对是恶评
-----------------------------------
题面有歧义,我们在搜索的时侯扩展的条件是<=,不是等于
-----------------------------------
#include <iostream> #include<cstdio> #include<algorithm> using namespace std; struct so{ int x; int y; int v; }s[500000]; int ma[800][800]; bool cmp(so x,so y){ return x.v>y.v; } int vis[800][800]; int x,y,n,m,now; int ans; int p; int xc[8]={1,1,0,-1,-1,-1,0,1}; int yc[8]={0,1,1,1,0,-1,-1,-1}; void dfs(int x,int y){ if(x<0||y<0||x>n||y>m){ return ; } vis[x][y]=1; for(int i=0;i<=7;++i){ if(ma[x+xc[i]][y+yc[i]]<=ma[x][y]&&!vis[x+xc[i]][y+yc[i]]) dfs(x+xc[i],y+yc[i]); } return ; } int main(){ cin>>n>>m; for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ scanf("%d",&now); ma[i][j]=now; p++; s[p].x=i; s[p].y=j; s[p].v=now; } } sort(s+1,s+p+1,cmp); for(int i=1;i<=p;++i){ if(!vis[s[i].x][s[i].y]){ ans++; dfs(s[i].x,s[i].y); } } cout<<ans; return 0; }