zoukankan      html  css  js  c++  java
  • [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;
    }
    

      

  • 相关阅读:
    爱情十二课,失恋后遗症
    爱情十三课,爱人的五功能
    爱情第八课,爱也是投资
    爱情第二课,择爱两大误区
    爱情十七课,吵架的原则
    MFC DC的获取
    MFC关于使用CArchive流输入产生的问题
    MFCCFileException类学习笔记
    MFC中指针的获取
    文字编辑和文字处理
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9347696.html
Copyright © 2011-2022 走看看