USACO 玉公尺田迷宮 Corn Maze

2021-08-01 13:54:43 字數 1809 閱讀 3781

移步到新blog檢視 (此blog已廢棄,已失效)

這題是乙個大坑。

首先我們想到了bfs,這個題就是乙個簡單到不能再簡單的maze加上傳送門就是了。

但是有一點是傳送門不費時啊!!什麼鬼。所以我們要先判傳送門

為什麼呢?我記得有一組測試資料報括了這種情況

這不清真

另外,好像還有乙個點是全都是傳送門的情況。

判傳送門(並不是判隊首元素位於傳送門,而是隊首座標移動之後),傳送過去之後耗時不加,佇列儲存傳送後的位置,這樣就不會產生無限傳送死迴圈的問題。

但是關於情況2怎麼辦?我們利用bfs的性質,把傳送門(傳過去之後)打上標記,然後就不用他了。(每一次用都是最早用他)

傳送門i hate you

讀入的時候記錄傳送門的相對座標,像這樣:

scanf("%s",&mapx[i]);

for (int j=0;j='a' && mapx[i][j]<='z')

else toit[mapx[i][j]-65][1][0]=i; toit[mapx[i][j]-65][1][1]=j;

}}

之後碰到傳送門直接查表。,順便記下起點sxsy和重點exey

#include#include#include#include#include#include#includeusing namespace std;

queuequex,quey;

int cachex,cachey;

char mapx[400][400]=;

int sx,sy,ex,ey,n,m;

int head=0,tail=1;

int timex[100000]=,toit[50][2][2];

bool checked[400][400]=;

int wayx[4]=,wayy[4]=;

int main()

} }quex.push(sx); quey.push(sy);

timex[1]=0;

while (quex.size()>0)

for (int i=0;i<=3;i++)

if (cachex+wayx[i]>=0 && cachex+wayx[i]=0 && cachey+wayy[i]='a' && mapx[cachex+wayx[i]][cachey+wayy[i]]<='z' && checked[cachex+wayx[i]][cachey+wayy[i]]==false)

{if (cachex+wayx[i]==toit[mapx[cachex+wayx[i]][cachey+wayy[i]]-65][0][0] && cachey+wayy[i]==toit[mapx[cachex+wayx[i]][cachey+wayy[i]]-65][0][1])

{tail++;

quex.push(toit[mapx[cachex+wayx[i]][cachey+wayy[i]]-65][1][0]); quey.push(toit[mapx[cachex+wayx[i]][cachey+wayy[i]]-65][1][1]);

timex[tail]=timex[head]+1;

checked[cachex+wayx[i]][cachey+wayy[i]]=true;

//cout<<"a "<<"x= "<

其實這個題處理好了傳送門,你會發現,其實不難……(輸出除錯**好)

記得用checked陣列標記已經訪問的點和傳送門,要不無限使用傳送門

P1825 玉公尺田迷宮

有了上次題目看錯的教訓後再不敢隨便看題了usaco太坑,這題絕對不水,傳送門還特別玄學自然 短不了 const z array 1.4,1.2 of 1.1 1,0 0,1 1,0 0,1 var i,j,k longint m,n longint pdx,pdy longint csmx,csmy...

方伯伯的玉公尺田

例題 方伯伯的玉公尺田 一位大佬的鏈結 有關二維樹狀陣列 關於我做這道題的心路歷程 1.我在某個晚上準備練習dp題,看到方伯伯的玉公尺田這 道題,難度適宜,知識簡單,準備做一做。乙個晚上過去 了,我除了推出了他每一次會抬高最右邊的玉公尺外,還推 出了一大堆錯誤結論,例如一定會從已有的上公升序列中的 ...

狀壓DP 玉公尺田

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...