[Usaco2005 Dec]Knights of Ni 騎士

来源:https://www.cnblogs.com/Wolfycz/archive/2018/02/03/8411133.html
-Advertisement-
Play Games

Description Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In ...


Description

Bessie is in Camelot and has encountered a sticky situation: she needs to pass through the forest that is guarded by the Knights of Ni. In order to pass through safely, the Knights have demanded that she bring them a single shrubbery. Time is of the essence, and Bessie must find and bring them a shrubbery as quickly as possible. Bessie has a map of of the forest, which is partitioned into a square grid arrayed in the usual manner, with axes parallel to the X and Y axes. The map is W x H units in size (1 <= W <= 1000; 1 <= H <= 1000). The map shows where Bessie starts her quest, the single square where the Knights of Ni are, and the locations of all the shrubberies of the land. It also shows which areas of the map can be traverse (some grid blocks are impassable because of swamps, cliffs, and killer rabbits). Bessie can not pass through the Knights of Ni square without a shrubbery. In order to make sure that she follows the map correctly, Bessie can only move in four directions: North, East, South, or West (i.e., NOT diagonally). She requires one day to complete a traversal from one grid block to a neighboring grid block. It is guaranteed that Bessie will be able to obtain a shrubbery and then deliver it to the Knights of Ni. Determine the quickest way for her to do so.

貝茜遇到了一件很麻煩的事:她無意中闖入了森林里的一座城堡,如果她想回家,就必須穿過這片由騎士們守護著的森林.為了能安全地離開,貝茜不得不按照騎士們的要求,在森林尋找一種特殊的灌木並帶一棵給他們.當然,貝茜想早點離開這可怕的森林,於是她必須儘快完成騎士們給的任務,貝茜隨身帶著這片森林的地圖,地圖上的森林被放入了直角坐標系,並按x,y軸上的單位長度劃分成了W×H(1≤W,H≤1000)塊,貝茜在地圖上查出了她自己以及騎士們所在的位置,當然地圖上也標註了她所需要的灌木生長的區域.某些區域是不能通過的(比如說沼澤地,懸崖,以及食人兔的聚居地).在沒有找到灌木之前,貝茜不能通過騎士們所在的那個區域,為了確保她自己不會迷路,貝茜只向正北、正東、正南、正西四個方向移動(註意,她不會走對角線).她要走整整一天,才能從某塊區域走到與它相鄰的那塊區域. 輸入數據保證貝茜一定能完成騎士的任務.貝茜希望你能幫她計算一下,她最少需要多少天才可脫離這可怕的地方?

Input

第1行輸入2個用空格隔開的整數,即題目中提到的W、H.

接下來輸入貝茜持有的地圖,每一行用若幹個數字代表地圖上對應行的地形.第1行描述了地圖最北的那一排土地;最後一行描述的則是最南面的.相鄰的數字所對應的區域是相鄰的.如果地圖的寬小於或等於40,那每一行數字恰好對應了地圖上的一排土地.如果地圖的寬大於40,那每行只會給出40個數字,並且保證除了最後一行的每一行都包含恰好40個數字.沒有哪一行描述的區域分佈在兩個不同的行里.

地圖上的數字所對應的地形:

0:貝茜可以通過的空地

1:由於各種原因而不可通行的區域

2:貝茜現在所在的位置

3:騎士們的位置

4:長著貝茜需要的灌木的土地

Output

輸出一個正整數D,即貝茜最少要花多少天才能完成騎士們給的任務.

Sample Input

8 4

4 1 0 0 0 0 1 0

0 0 0 1 0 1 0 0

0 2 1 1 3 0 4 0

0 0 0 4 1 1 1 0

Sample Output

11

HINT

 這片森林的長為8,寬為4.貝茜的起始位置在第3行,離騎士們不遠.


貝茜可以按這樣的路線完成騎士的任務:北,西,北,南,東,東,北,東,東,南,南.她在森林的西北角得到一株她需要的灌木,然後繞過障礙把它交給在東南方的騎士.

這題其實並不難想,兩遍bfs,從貝茜的位置跑一遍,再從騎士的位置跑一遍,然後掃到有灌木的點隨便搞一下就可以了

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<1)+(x<<3)+ch-'0';
    return x*f;
}
inline void print(int x){
    if (x>=10)     print(x/10);
    putchar(x%10+'0');
}
const int N=1e3;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int map[N+10][N+10],dis[N+10][N+10],dist[N+10][N+10];
int hx[N*N+10],hy[N*N+10];
int n,m,O1x,O1y,O2x,O2y;
bool in_map(int x,int y){return x>0&&x<=n&&y>0&&y<=m;}
void bfs1(int x,int y){
    int head=1,tail=1;
    memset(dis,-1,sizeof(dis));
    hx[1]=x,hy[1]=y,dis[x][y]=0;
    for (;head<=tail;head++){
        int Nx=hx[head],Ny=hy[head];
        for (int i=0;i<4;i++){
            int tx=Nx+dx[i],ty=Ny+dy[i];
            if (!in_map(tx,ty)||dis[tx][ty]!=-1||map[tx][ty]==1)    continue;
            dis[tx][ty]=dis[Nx][Ny]+1;
            hx[++tail]=tx,hy[tail]=ty;
        }
    }
}
void bfs2(int x,int y){
    int head=1,tail=1;
    memset(dist,-1,sizeof(dist));
    hx[1]=x,hy[1]=y,dist[x][y]=0;
    for (;head<=tail;head++){
        int Nx=hx[head],Ny=hy[head];
        for (int i=0;i<4;i++){
            int tx=Nx+dx[i],ty=Ny+dy[i];
            if (!in_map(tx,ty)||dist[tx][ty]!=-1||map[tx][ty]==1)   continue;
            dist[tx][ty]=dist[Nx][Ny]+1;
            hx[++tail]=tx,hy[tail]=ty;
        }
    }
}
int work(){
    int Min=inf;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++){
            if (map[i][j]!=4||dis[i][j]==-1||dist[i][j]==-1)    continue;
            Min=min(Min,dis[i][j]+dist[i][j]);
        }
    return Min;
}
int main(){
    m=read(),n=read();
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++){
            map[i][j]=read();
            if (map[i][j]==2)   O1x=i,O1y=j;
            if (map[i][j]==3)   O2x=i,O2y=j;
        }
    bfs1(O1x,O1y),bfs2(O2x,O2y);
    printf("%d\n",work());
    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • 該系列教程系個人原創,並完整發佈在個人官網 "劉江的博客和教程" 所有轉載本文者,需在頂部顯著位置註明原作者及www.liujiangblog.com官網地址。 Python及Django學習QQ群:453131687 一、表單form 為了接收用戶的投票選擇,我們需要在前端頁面顯示一個投票界面。讓 ...
  • 提到分發請求,相信大多數人首先會想到Nginx,Nginx作為一種多功能伺服器,不僅提供了反向代理隱藏主機ip的能力,還擁有簡單的緩存加速功能。當然Nginx最強大的功能還是分發請求,不僅提供了哈希,一致性哈希,負載均衡等多種請求分發模式,還保證了自己服務的輕量和穩定。一臺Nginx伺服器常年工作在 ...
  • 什麼是Activity劫持 簡單的說就是APP正常的Activity界面被惡意攻擊者替換上仿冒的惡意Activity界面進行攻擊和非法用途。界面劫持攻擊通常難被識別出來,其造成的後果不僅會給用戶帶來嚴重損失,更是移動應用開發者們的惡夢。舉個例子來說,當用戶打開安卓手機上的某一應用,進入到登陸頁面,這 ...
  • JavaScript避坑記 轉載請註明源地址: http://www.cnblogs.com/funnyzpc/p/8407952.html 上圖=> 有意思的漫畫,不知大家看懂了沒,這裡我想說的是以上這些坑我都碰過,當然包含且不僅限於此, 遂這次借漫畫將之前寫前端時掉過的坑一一羅列哈(雖然不夠完整 ...
  • 容器 Servlet沒有main()方法,它們受控於另一個Java應用,這個Java應用稱為容器(Container)。我們最常見的tomcat就是這樣一個容器。 Web伺服器應用(如Apache)得到一個指向Servlet的請求(而不是其他請求,如請求一個普通的靜態HTML頁面)時,伺服器不是把這 ...
  • 引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中國電腦學會(CCF)發起的"電腦職業資格認證"考試,針對電腦軟體開發、軟體測試、信息管理等領域的專業人士進行能力認證。認證對象是從事或將要從事IT領域專業技術與技術管理人 ...
  • mser 的全稱:Maximally Stable Extremal Regions 第一次聽說這個演算法時,是來自當時部門的一個同事, 提及到他的項目用它來做文字區域的定位,對這個演算法做了一些優化。 也就是中文車牌識別開源項目EasyPR的作者liuruoze,劉兄。 自那時起就有一塊石頭沒放下,想 ...
  • /** *Created by xuzili at 9:38 PM on 2/3/2018 */ public class bubble { public static void main(String[] args) { int[] a = new int[]{9, 6, 8, 3, 0, 1}; ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...