馬攔過河卒

2021-06-02 09:43:32 字數 2512 閱讀 9777

【問題描述】

棋盤上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...