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