P3610 奶牛導航

2021-09-10 16:46:55 字數 3263 閱讀 2476

這題算是p1126 機械人搬重物的公升級版qaq,就是把他當成兩隻牛來算就好了

const z:array[1..4,1..2]of -1..1=((-1,0),(0,1),(1,0),(0,-1));

var i,j,k:longint;

n:longint;

bo:array[0..21,0..21,0..21,0..21,1..4,1..4]of boolean;

//6維陣列,為第一只牛的座標、方向,第二隻牛的座標、方向

no:array[0..21,0..21]of boolean;

x1,y1,x2,y2,u,fx1,fx2:array[0..10000000]of longint;

_x1,_y1,_x2,_y2,_fx1,_fx2:longint;

ch:char;

h,t:longint;

x1i,y1i,x2i,y2i:longint;

procedure add(x1,y1,x2,y2:longint);//當前這一格是可以走的

var i,j:longint;

begin

for i:=1 to 4 do

for j:=1 to 4 do

bo[x1,y1,x2,y2,i,j]:=true;

end;

function left(fx:longint):longint;//左轉

begin

if fx=1 then exit(4) else exit(fx-1);

end;

function right(fx:longint):longint;//右轉

begin

if fx=4 then exit(1) else exit(fx+1);

end;

procedure go(fx:longint;var x,y:longint);//判斷可不可以走...

begin

if (x=1) and (y=n) then exit;//到了終點就不可以走了

if no[x+z[fx,1],y+z[fx,2]] then//移動

begin

x:=x+z[fx,1];

y:=y+z[fx,2];

end;

end;

begin

readln(n);

for i:=1 to n do

begin

for j:=1 to n do

begin

read(ch);

if ch='e' then

no[i,j]:=true;

end;

readln;

end;

//判斷用的陣列初始化

for x1i:=1 to n do

for y1i:=1 to n do

for x2i:=1 to n do

for y2i:=1 to n do

if no[x1i,y1i] and no[x2i,y2i] then

add(x1i,y1i,x2i,y2i);

//佇列初始化

h:=1;

t:=1;

x1[1]:=n;

y1[1]:=1;

x2[1]:=n;

y2[1]:=1;

u[1]:=0;

fx1[1]:=1;

fx2[1]:=2;

bo[x1[1],y1[1],x2[1],y2[1],fx1[1],fx2[1]]:=false;

repeat

if (x1[t]=1) and (x2[t]=1) and (y1[t]=n) and (y2[t]=n) then//兩隻牛都到終點了

begin

write(u[t]);

exit;

end;

for i:=1 to 3 do

begin

if i=1 then

begin

//記錄下來比較方便

_x1:=x1[t];

_y1:=y1[t];

_x2:=x2[t];

_y2:=y2[t];

go(fx1[t],_x1,_y1);

go(fx2[t],_x2,_y2);

if(bo[_x1,_y1,_x2,_y2,fx1[t],fx2[t]])then//判斷向前走可不可以

begin//入佇列

inc(h);

x1[h]:=_x1;

y1[h]:=_y1;

x2[h]:=_x2;

y2[h]:=_y2;

fx1[h]:=fx1[t];

fx2[h]:=fx2[t];

bo[_x1,_y1,_x2,_y2,fx1[t],fx2[t]]:=false;

u[h]:=u[t]+1;

end;

end;

if i=2 then

if(bo[x1[t],y1[t],x2[t],y2[t],left(fx1[t]),left(fx2[t])])then//左轉

//轉彎不會到地圖外面和草上,不用特判

begin

inc(h);

fx1[h]:=left(fx1[t]);

fx2[h]:=left(fx2[t]);

x1[h]:=x1[t];

y1[h]:=y1[t];

x2[h]:=x2[t];

y2[h]:=y2[t];

bo[x1[h],y1[h],x2[h],y2[h],fx1[h],fx2[h]]:=false;

u[h]:=u[t]+1;

end;

if i=2 then

if(bo[x1[t],y1[t],x2[t],y2[t],right(fx1[t]),right(fx2[t])])then//右轉qaq

begin

inc(h);

fx1[h]:=right(fx1[t]);

fx2[h]:=right(fx2[t]);

x1[h]:=x1[t];

y1[h]:=y1[t];

x2[h]:=x2[t];

y2[h]:=y2[t];

bo[x1[h],y1[h],x2[h],y2[h],fx1[h],fx2[h]]:=false;

u[h]:=u[t]+1;

end;

end;

inc(t);

until t>h;

end.

就是寫起來累點,思路還是很清楚的qaqwq

P2345 奶牛集會

約翰的n 頭奶牛每年都會參加 哞哞大會 哞哞大會是奶牛界的盛事。集會上的活動很多,比如堆乾草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的座標為xi,沒有兩頭奶牛的座標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max xi xj 的音量,其中vi 和vj 分...

P2340 奶牛會展

f i 表示當 智商為i 時,情商 最高為多 少f i 表示當智商為i時,情商最高為多少 f i 表示 當智商為 i時,情 商最高為 多少具體類似講解請移步我的另一篇部落格 include define rep i,a,b for register int i a i b i define don ...

p1342奶牛通訊

描述 description 很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。有兩頭奶牛就想 如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值和與之...