【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述

Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域,第i行第j列的格子記為(i,j),也就是左上角為(1,1),右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中,冰地外圍(即第0行、第n+1行、第0列、第m+1列)的所有格子均有障礙物。除此之外,冰地內共有k個障礙物和減速帶,其余格子為冰面。
初始時,有一個冰塊位于(1,1)處。Dpstr每次可以選擇上、下、左、右四個方向之一推動該冰塊,推動后該冰塊將一直沿此方向移動,直到冰塊所在的格子為減速帶,或冰塊沿運動方向的下一個格子為障礙物時,冰塊將停止運動。一旦冰塊停在減速帶上,該減速帶即消失。
Dpstr希望通過盡量少的推動次數使得冰塊停在(n,m)處。請計算Dpstr至少要推多少次冰塊。

數據范圍

對于30%的數據,2≤n≤5,2≤m≤5,0≤k≤5;
對于50%的數據,2≤n≤1,000,2≤m≤1,000,0≤k≤1,000;
對于70%的數據,2≤n≤50,000,2≤m≤50,000,0≤k≤50,000;
對于100%的數據,2≤n≤1,000,000,000,2≤m≤1,000,000,000,0≤k≤50,000,1≤xi≤n,1≤yi≤m,0≤ti≤1。

解法

顯然每個格子最多只會走一次。
所以可以使用BFS。
運用二分解決滑行問題。

代碼

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="ice.in";
const char* fout="ice.out";
const ll inf=0x7fffffff;
const ll maxn=50007,maxt=1000007;
const ll fx[4][2]={{0,-1},{-1,0},{1,0},{0,1}};
ll n,m,n1,i,j,k,l,ans=inf;
struct node{ll x,y,z;void operator =(const node &j){x=j.x;y=j.y;z=j.z;}
}f[maxn],g[maxn];
ll b[maxt][2],head,tail;
ll h[maxt],dis[maxt];
ll hash(ll x){ll t=x%maxt;while (h[t] && h[t]!=x) t=(t+1)%maxt;return t;
}
ll pos(ll x,ll y){return (x-1)*m+y;
}
void add(ll x,ll y,ll z){ll k=pos(x,y),i,j;i=hash(k);if (!h[i]) {h[i]=k;dis[i]=z;b[++tail][0]=x;b[tail][1]=y;}
}
void bfs(ll x,ll y){ll xx[4],yy[4],i,j,k,dist,now,l,r,mid,o;bool bz[4];add(x,y,0);while (head++<tail){j=b[head][0];k=b[head][1];now=hash(pos(j,k));memset(bz,0,sizeof(bz));l=1;r=n1;while (l<r){mid=(l+r+1)/2;if (f[mid].x<j || f[mid].x==j && f[mid].y<k) l=mid;else r=mid-1;}for (o=l;o<=l+2;o++){if (o>n1) break;if (f[o].x==j && f[o].y<k) {xx[0]=f[o].x;yy[0]=f[o].y+(f[o].z==0);bz[0]=true;}if (f[o].x==j && f[o].y>k){xx[1]=f[o].x;yy[1]=f[o].y-(f[o].z==0);bz[1]=true;break;}}if (!bz[0]) xx[0]=j,yy[0]=1;if (!bz[1]) xx[1]=j,yy[1]=m;l=1;r=n1;while (l<r){mid=(l+r+1)/2;if (g[mid].y<k || g[mid].y==k && g[mid].x<j) l=mid;else r=mid-1;}for (o=l;o<=l+2;o++){if (o>n1) break;if (g[o].y==k && g[o].x<j) {xx[2]=g[o].x+(g[o].z==0);yy[2]=g[o].y;bz[2]=true;}if (g[o].y==k && g[o].x>j){xx[3]=g[o].x-(g[o].z==0);yy[3]=g[o].y;bz[3]=true;break;}}if (!bz[2]) xx[2]=1,yy[2]=k;if (!bz[3]) xx[3]=n,yy[3]=k;for (i=0;i<4;i++){add(xx[i],yy[i],dis[now]+1);if (xx[i]==n && m==yy[i]) ans=min(ans,dis[now]+1);}}
}
bool cmp(node a,node b){return a.x<b.x || a.x==b.x && a.y<b.y;
}
bool cmp1(node a,node b){return a.y<b.y || a.y==b.y && a.x<b.x;
}
int main(){freopen(fin,"r",stdin);freopen(fout,"w",stdout);scanf("%d%d%d",&n,&m,&n1);for (i=1;i<=n1;i++) scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z),g[i]=f[i];sort(f+1,f+n1+1,cmp);sort(g+1,g+n1+1,cmp1);bfs(1,1);printf("%lld",ans);return 0;
}

啟發

對于搜索題,從最簡單的搜索入手。
初始搜索最好打bfs,因為最容易優化,而且最短路最快找到。
然后根據客觀的時間耗費,優化對應的地方。

轉載于:https://www.cnblogs.com/hiweibolu/p/6714847.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256070.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…

MATLAB調用Python自定義函數(類、函數等) Python調用MATLAB

一、MATLAB調用Python函數 參考鏈接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎鏈接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上這位說的更加的詳細&#xff0c;感謝 二、Python調用MATLAB-API 知乎鏈接&#xff1a;htt…

Testin云測與ARM 戰略合作:推動全球移動應用加速進入中國市場

Testin云測與ARM 戰略合作&#xff1a;推動全球移動應用加速進入中國市場 2014/10/14 Testin 業界資訊&#xff08;中國北京–2014年10月14日 &#xff09;全球最大的移動游戲、應用真機和用戶云測試平臺Testin云測今日宣布與ARM建立戰略伙伴合作關系&#xff0c;設立“ARM應…

iOS:真機調試

真機調試現在發生了改變&#xff0c;在Xcode7以前進行真機調試是需要證書的&#xff0c;正是由于這個原因&#xff0c;這個過程比較麻煩&#xff1b;在Xcode7以后是免證書的&#xff0c;使用起來就簡單很多了。 Xcode7以前的步驟如下&#xff1a; 原鏈接地址為&#xff1a;http…

正則表達式快速入門,轉載

正則表達式快速入門 首先簡單介紹下正則表達式&#xff1a; 在編寫處理字符串的程序或網頁時&#xff0c;經常會有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說&#xff0c;正則表達式就是記錄文本規則的代碼。 下面就看看正則表達式里…

C++總結筆記(十三)—— 類型轉換

文章目錄一、類型轉換簡介二、示例1.隱式類型轉換2.強制類型轉換一、類型轉換簡介 C中類型轉換從形式上可分為顯式和隱式兩種。 隱式類型轉換則是由編譯器自動完成類型轉換過程&#xff0c;可以分為內置數據類型轉換和自定義數據類型轉換。 顯式的類型轉換通常使用強制類型轉…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件轉py文件及no Qt platform plugin could be initialized 問題解決】

目錄 一、尋找designer.exe 二、no Qt platform plugin could be initialized 問題解決 三、ui文件轉換為py文件 四、pyqt5的使用教程 一、尋找designer.exe 頭疼&#xff0c;找了一上午都沒有找到這個的路徑&#xff0c;最后還是在評論區看到的&#xff0c;這也不能怪人家…

mysql語句大全

1、說明&#xff1a;創建數據庫CREATE DATABASE database-name2、說明&#xff1a;刪除數據庫drop database dbname3、說明&#xff1a;備份sql server--- 創建 備份數據的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 開始 備份B…

【翻譯】在Ext JS和Sencha Touch中創建自己定義布局

原文&#xff1a;Creating Custom Layouts in Ext JS and Sencha Touch布局系統是Sencha框架中最強大和最獨特的一部分。布局會處理應用程序中每個組件的大小和位置&#xff0c;因而&#xff0c;不須要手動去管理那些碎片。Ext JS與Sencha Touch的布局類有很多類似之處。近期在…

PCL中GreedyProjection三角化算法簡介與示例

文章目錄前言一、PCL點云三角化1.1 Delaunay三角剖分1.2 貪婪三角化二、程序示例總結前言 Delaunay三角剖分最初應用于2維領域&#xff0c;而與Greedy三角化算法的結合&#xff0c;使之成為目前在三維重建領域最為基礎的算法原理之一&#xff0c;很多學者針對其原理進行改進用…

[設計模式]中介者模式之Events消息傳遞實現

這篇文章比較短,修改自 寫給大家看的設計模式之中介者中的例子中介者模式的定義和目的自不必說, 參考上文即可. 本文針對實現方式做一個補充. 中介者模式增加了一個第三方對象(中介者)來控制兩個對象(同事)間的交互. 有助于對彼此通信的解耦, 畢竟他們并不需要關心對方的實現細…

【pyqt5】 讀取numpy arrray 顯示圖片

目錄 1、GUI界面&#xff08;QT designer設計&#xff09; 2、邏輯函數&#xff08;回調等&#xff09; 3、顯示圖片在label上 0&#xff09;直接利用QPixmap顯示圖像 1&#xff09;顯示彩色圖 彩色圖顯示色調不正常——opencv&#xff08;BGR&#xff09;QT(RGB)需要進行…

[Django]SE項目回憶錄(二)-注冊/登錄功能的實現及細節

該項目中提供了注冊和登錄兩部分功能&#xff0c;功能描述如下&#xff1a; 注冊&#xff1a; 允許任何用戶進行學生身份的注冊。 教師用戶預先已經保存在數據庫中&#xff0c;不允許以游客身份注冊新的教師用戶。 注冊時需要填寫的信息包括&#xff1a; - 用戶名 - 密碼(…

Zip4j開源jar包的簡單使用

因為對項目突然要發送壓縮加密的郵件附件&#xff0c;所以從網上看了一些資料說Zip4j開源框架比較好使&#xff0c;對中文的支持也比較好&#xff0c;所以從網上找了一個代碼案例&#xff01;自己寫了一寫&#xff0c;現在貼出來&#xff0c;方便以后想用的時候好找 1、 1 pack…

【pyqt5】——入門級模板(ui文件+ui轉py文件+邏輯py文件)(消息提示框)

目錄 1、ui文件 2、ui轉py文件 3、邏輯py文件 4、實例 1&#xff09;ui文件——demo.ui 2&#xff09;ui轉py文件——demo.py 3)邏輯py文件——demoLogic.py 4)運行結果 1、ui文件 這個文件是直接通過pyqt5 designer進行設計的&#xff0c;相關配置可見《配置Qt Design…

PCL中點特征描述子PFH、FPFH和VFH簡述和示例

文章目錄前言一、點特征直方圖1.1 PFH1.1.1 法線估計1.1.2 特征計算1.2 FPFH1.3 VFH二、示例2.1 PFH計算2.2 FPFH2.3 VFH前言 點特征直方圖是PCL中非常重要的特征描述子&#xff0c;在點云匹配、分割、重建等任務中起到關鍵作用&#xff0c;可以對剛體變換、點云密度和噪聲均有…

BZOJ 1005: [HNOI2008]明明的煩惱

BZOJ 1005: [HNOI2008]明明的煩惱 Description 自從明明學了樹的結構,就對奇怪的樹產生了興趣......給出標號為1到N的點,以及某些點最終的度數,允許在 任意兩點間連線,可產生多少棵度數滿足要求的樹? Input 第一行為N(0 < N < 1000), 接下來N行,第i1行給出第i個節點的度…

Apache Directory 指令

<Directory> 指令 語法&#xff1a;<Directory directory-path> ... </Directory> <Directory>和</Directory>用于封裝一組指令&#xff0c;使之僅對某個目錄及其子目錄生效。任何可以在"directory"作用域中使用的指令都可以使用。Dir…