[USACO08NOV]守护农场Guarding the Farm

首先我要提醒各位:数组开打点,不然你会永远73分(鄙视出数据的人),本题用DFS就可以了,去枚举每一种的方向,判断是否低于它,然后就没有然后了,

代码:

#include<bits/stdc++.h>
using namespace std;
struct str
{
    int h,z,g;//定义结构体,懒 
}b[10000001];
int a[1100][1100],k;
bool cmp(str x,str y)
{
    return x.g>y.g;//判断是否低于他 
}
int ans=0,sum=0;
int n,m;
void dfs(int x,int y)//去找 
{
//	if(x+1>n&&x-1<1&&y+1>m&&y-1<1) return ; 
    sum++;
    int ji_lu=a[x][y];//记录一下 
    a[x][y]=9999999;//标记是否找过了 
    //八个方向 
	if(ji_lu>=a[x+1][y]) dfs(x+1,y);
	if(ji_lu>=a[x-1][y]) dfs(x-1,y);
    if(ji_lu>=a[x][y-1]) dfs(x,y-1);
    if(ji_lu>=a[x][y+1]) dfs(x,y+1);
    if(ji_lu>=a[x+1][y-1]) dfs(x+1,y-1);
    if(ji_lu>=a[x+1][y+1]) dfs(x+1,y+1);
	if(ji_lu>=a[x-1][y-1]) dfs(x-1,y-1);
    if(ji_lu>=a[x-1][y+1]) dfs(x-1,y+1);
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<=m+1;i++)//防止越界 
    {
        a[0][i]=9999999;
        a[n+1][i]=9999999;
    }
    for(int i=0;i<=n+1;i++)//防止越界 
    {
        a[i][0]=9999999;
        a[i][m+1]=9999999;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            k++;
            cin>>a[i][j];
            b[k].g=a[i][j];//记录 
            b[k].h=i;
            b[k].z=j;
        }
    }
    sort(b+1,b+1+n*m,cmp);//排序 
    k=0;
    while(sum<n*m)//sum为找了多少座。 
    {
        ans++;
        while(a[b[k].h][b[k].z]==9999999) k++;//下标 
        dfs(b[k].h,b[k].z);
    }
    cout<<ans<<endl;
}

  

posted @ 2018-07-21 19:22  DJY_01  阅读(267)  评论(0编辑  收藏  举报