守衛農場題解

来源:https://www.cnblogs.com/wangshengjun/archive/2018/10/01/luoguP2919.html
-Advertisement-
Play Games

題面 【問題描述】 農夫 John 的農場里有很多小山丘,他想要在那裡佈置一些保鏢去保衛他的那些相當值錢的奶牛們。 他想知道如果在一座小山丘上佈置一名保鏢的話,他總共需要招聘多少名保鏢。他現在有一個用數 字矩陣來表示地形的地圖。這個矩陣有 N 行和 M 列。矩陣中的每個元素都有一個值 H_ij 來表 ...


題面

【問題描述】

農夫 John 的農場里有很多小山丘,他想要在那裡佈置一些保鏢去保衛他的那些相當值錢的奶牛們。 他想知道如果在一座小山丘上佈置一名保鏢的話,他總共需要招聘多少名保鏢。他現在有一個用數 字矩陣來表示地形的地圖。這個矩陣有 N 行和 M 列。矩陣中的每個元素都有一個值 H_ij 來表示該地區 的海拔高度。請你幫助他統計出地圖上到底有多少個小山丘。 小山丘的定義是:若地圖中一個元素所鄰接的所有元素都比這個元素高度要小或者相等(或它鄰接 的是地圖的邊界), 則該元素和其周圍所有按照這樣順序排列的元素的集合稱為一個小山丘(本題某個 非邊界點跟它相鄰的有 8 個點:上、下、左、右、左上、右上、左下、右下)。

【輸入格式】

第 1 行:兩個由空格隔開的整數 N 和 M;

第 2 行到第 N+1 行:第 I+1 行描述了地圖上的第 I 行,有 M 個由空格隔開的整數: H_ij。

【輸出格式】

一個整數,表示小山丘的個數。

【輸入樣例】

 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

【輸出樣例】

3

【樣例解釋】

樣例中,小山丘的中心點分別為(1, 1),(7, 3),(1, 7)。//多了這個

【數據規模】

  對於 70%的數據: 1<N≤100; 1<M≤100;

對於 100%的數據: 1<N≤700; 1<M≤700; O≤H_ij≤10,000;

題解:

#include<bits/stdc++.h>
using namespace std;
int dx[]={-1,-1,-1, 0, 0, 1, 1, 1};//從八個方向去搜索即可(上下左右等) 
int dy[]={-1, 0, 1,-1, 1,-1, 0, 1};
//也可以 int dx[8]={-1,-1,-1, 0, 0, 1, 1, 1};
//int dy[8]={-1, 0, 1,-1, 1,-1, 0, 1}; 8個方向8個元素即可搜索 
int n,m,flag;
int v[710][710],a[710][710];
int check(int i, int j)
{
    if(i>=0&&i<n&&j>=0&&j<m)
return 1;
    return 0;
}
/*
bool check(int i,int j)
{
    if(i>=0&&i<n&&j>=0&&j<m)
    return true;
    return false;
} //用bool的寫法 true==1,false==0; 
*/ 
void dfs(int i,int j)//廣搜 
{
    int x,y;
    for(int k=0;k!=8;++k)
    {
       x=i+dx[k];
       y=j+dy[k];
       if (check(x,y))
       {
           if (a[x][y]>a[i][j])
           flag = 0;
if (!v[x][y]&&a[x][y]==a[i][j])
           {
               v[x][y] = 1;
               dfs(x,y);
           }
       }
    }
}
/*
inline int read(){
    int ret=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
    while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    return ret*f;
}
*/ 
int main()
{
    //freopen("guard.in","r",stdin); //文件輸出流!! 
 //freopen("guard.out","w",stdout); 
    scanf("%d%d",&n,&m);//讀入可用讀優inline 優化加快讀入
    /*n=read();m=read();
    */
    for(int i=0;i!=n;++i)
        for (int j=0;j!=m;++j)
        {
            scanf("%d",&a[i][j]);
            //a[i][j]=read();
            v[i][j]=0;//初始化為0 
        }
    int ans=0;//統計小丘個數初始化為0 
    for(int i=0;i!=n;++i)//先加再做下一步 
        for(int j=0;j!=m;++j)
        if(a[i][j]&&!v[i][j])
        {
            flag=1;//為真,相加即可 
            dfs(i,j);//廣度優先搜索dfs 
            ans+=flag;
        }
    cout<<ans<<endl;//輸出 
return 0;
}

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於圖像模糊演算法的實現, 我相信大多數學習圖像演算法的朋友都很熟悉。 例如常見的毛玻璃效果,高斯模糊等等。 而圖像模糊最簡單的實現就是 在一定區域 對像素做平均值計算。 術語描述,捲積。 1.認識捲積 而平均值計算可以,是一種常見的捲積計算,捲積核權重都為1。 OpenCV中與之對應的演算法是BoxBl ...
  • 1.Eclipse無法連接到Eclipse Marketplace的解決方法 (1)在eclipse文件夾下的eclipse.ini文件末尾添加 -Djava.net.preferIPv4Stack=true (2)點擊Add進行添加 (3)在help–install new software–ad ...
  • 1998年 SUN發佈三個不同版本JAVA,分別是: Java J2EE(Java Platform,Enterprise Edition) JAVA企業版,應用為開發和部署可移植、健壯、可伸縮且安全的伺服器端Java應用程式。 Java J2SE(Java Platform,Standard Ed ...
  • 題意 "題目鏈接" Sol Get到了這題樹狀數組的做法,感覺非常nice 區間加:直接差分 區間求和:考慮每一位的貢獻 $sum_{i = 1}^x (x+1 i) d_i$ $= sum_{i = 1}^x (x+1)d_i \sum_{i = 1}^x id_i$ $= (x+1) sum_{ ...
  • 當我們想要將數組值存儲到資料庫時,就可以對數組進行序列化操作,然後將序列化後的值存儲到資料庫中。其實PHP序列化數組就是將複雜的數組數據類型轉換為字元串,方便數組存庫操作。對PHP數組進行序列化和反序列化操作,主要就用到兩個函數,serialize和unserialize。 一、PHP數組序列化:s ...
  • 一、什麼是JAVA 二、JAVA發展歷史 1991年 SUN公司為搶占電腦單片機嵌入式領域市場,成立GReen項目小組,專攻家電嵌入式應用。由於C++程式複雜龐大,且跨平臺是個問題,所以對C++進行改造,去除了留在C++的一些不太實用及影響安全的成分,並結合嵌入式系統的實時性要求,開發了一種稱為O ...
  • 一、如何進入設置界面 1. File -- Settings 2. 小圖標 二、常用設置 註意: IDEA中的這些設置,一次就好,因為設置信息是配置在C盤根目錄下,所有創建的工程共用這一套設置。 區別於Eclipse,每建一個workspace,就要從新設置一邊。 1. 更換主題 2. 顯示常用工具 ...
  • 一. 前言在前上一章教程中,介紹了用SQL查詢本地文件。程式代碼請從這裡下載。 本章將在上一章的基礎上,進一步擴展程式。實際的生產環境中,一般查詢的文件都放在遠程的文件或數據伺服器上,下麵我將帶大家一步一步實現遠程查詢的程式。 註:1.本文針對初學Java的同學訓練學習思路,請不要太糾結於細節問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...