【問題描述】
棋盤上a
點有乙個過河卒,需要走到目標
b點。卒行走的規則:可以向下、或者向右。同時在棋盤上
c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。
棋盤用座標表示,a
點(0, 0)、b
點(n, m)(n, m為不超過
15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從a
點能夠到達
b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
【輸入】
一行四個資料,分別表示b
點座標和馬的座標。
【輸出】
乙個資料,表示所有的路徑條數。
【樣例】
knight.in
6 6 3 3
knight.out
這道題,是簡單的回溯,卒只能向下或向右走,所以可以回溯,也可以用遞推,但如果可以向上、下、左、右四個方向走時,就只能用回溯了。。。。。。。。
回溯:
var n,m,x,y:byte;ans:longint;
v:array[0..15,0..15]of boolean;
procedure init;
begin
fillchar(v,sizeof(v),true);
readln(n,m,x,y);
v[x,y]:=false;
v[x+1,y+2]:=false;v[x-1,y+2]:=false;
v[x+1,y-2]:=false;v[x-1,y-2]:=false;
v[x+2,y+1]:=false;v[x-2,y+1]:=false;
v[x+2,y-1]:=false;v[x-2,y-1]:=false;
end;
procedure dfs(x0,y0:byte);
begin
if (x0=n)and(y0=m) then
inc(ans);//若這裡用begin inc(ans);exit;end; 「12 12 5 6」這個點就會超時
if (x0+1<=n)and(v[x0+1,y0]) then dfs(x0+1,y0);
if (y0+1<=m)and(v[x0,y0+1]) then dfs(x0,y0+1);
end;
procedure main;
begin
ans:=0;
dfs(0,0);
writeln(ans);
end;
begin
assign(input,'knight.in');reset(input);
assign(output,'knight.out');rewrite(output);
init;
main;
close(input);close(output);
end.
遞推:
var a:array[-1..15,-1..15]of longint;
v:array[0..15,0..15]of boolean;
n,m,x,y:byte;
procedure init;
var i:byte;
begin
readln(n,m,x,y);
fillchar(v,sizeof(v),true);
fillchar(a,sizeof(a),0);
v[x,y]:=false;
v[x+1,y+2]:=false;v[x-1,y+2]:=false;
v[x+1,y-2]:=false;v[x-1,y-2]:=false;
v[x+2,y+1]:=false;v[x-2,y+1]:=false;
v[x+2,y-1]:=false;v[x-2,y-1]:=false;
if v[0,0] then a[0,0]:=1;
for i:=1 to n do if v[i,0] then a[i,0]:=a[i-1,0]+a[i,0];
for i:=1 to m do if v[0,i] then a[0,i]:=a[0,i-1]+a[0,i];
end;
procedure main;
var i,j:byte;
begin
for i:=1 to n do
for j:=1 to m do
if v[i,j] then a[i,j]:=a[i,j]+a[i-1,j]+a[i,j-1];
writeln(a[n,m]);
end;
begin
assign(input,'knight.in');reset(input);
assign(output,'knight.out');rewrite(output);
init;
main;
close(input);close(output);
end.
馬攔過河卒
如圖,a點有乙個過河卒,需要走到目標 b點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c點上的馬可以控制 9個點 圖中的p1,p2 p8和 c 卒不能通過對方馬的控制點。棋盤用座標表示,a點 0,...
馬攔過河卒
problem description 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過15的整數 同樣...
馬攔過河卒
time limit 1000ms memory limit 65536kb submit statistic discuss problem description 的螺旋方陣當n 5和n 3時分別是如下的形式 請給出乙個程式,對於任意的輸入 0 11 輸出按照上面規律所獲得的 的螺旋方陣。inp...