馬攔過河卒

2021-10-18 23:13:09 字數 1912 閱讀 7299

time limit 3000 ms

mem. limit 65536 kib

description

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則:可以向下、或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。棋盤用座標表示,a點(0,0)、b點(n,m)(n,m為不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從a點能夠到達b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

input

一行四個資料,用空格分隔,分別表示b點的座標和馬的座標。

output

乙個資料,表示所有的路徑條數。

**sample

input

6 6 3 3

output

6對於卒來說,由於卒只能向下或者向右走,所以走到(x,y)點的路徑數,就等於走到(x-1,y)的路徑數加上(x,y-1)的路徑數。而對於馬來說,馬佔據著自身的(n,m)點,和以它為中心,所有日字格的點,總共9個點(在不出邊界的情況下)。因此,此題就是在不走到馬佔據的點的情況下,按著f[i

][j]

=f[i

−1][

j]+f

[i][

j−1]

f[i][j]=f[i-1][j]+f[i][j-1]

f[i][j

]=f[

i−1]

[j]+

f[i]

[j−1

](f[i][j]是走到(i,j)點的路徑數)的公式來遞推路徑數即可。

為了方便理解以下面一圖為樣例,馬所在的點為紅點,它所能佔據其他日字格為紅點。

假設用二維陣列f[i][j]表示到達(i,j)點的路徑數,g[i][j]表示馬是否控制(i,j)這個點,g[i][j]=0表示馬並沒控制此點,g[i][j]=1表示馬控制此點,所以會有如下關係式子。

f[i][j]=0 ,當g[i][j]==1時

f[i][0]=f[i-1][0] ,當i>0,g[i][0]==0時

f[0][j]=f[0][j-1],當j>0,g[0][j]==0時

f[i][j]=f[i-1][j]+f[i][j-1],當i>0,j>0且g[i][j]==0時

#include

int main()

;//保證馬走日字格

int y1[9]

=;// 所有日字格的情況

int n,m,x,y,i,j;

long long f[20]

[20]=

;//先初始化

int g[20]

[20]=

;scanf

("%d%d%d%d"

,&n,

&m,&x,

&y);

//根據要求輸入資料

g[x]

[y]=1;

//把馬所在的點標記為1

for(i=

1;i<=

8;i++

)for

(i=1

;i<=n;i++

)//在邊界上如果馬佔據一點,因為馬只能向下或向右,所以之後的點都不能走了

for(j=

1;j<=m;j++

)//與上面同理

for(i=

1;i<=n;i++

)//再把上面的情況算完之後,挨個遍歷開始算到f[n][m]

}printf

("%lld\n"

,f[n]

[m])

;return0;

}

馬攔過河卒

問題描述 棋盤上a 點有乙個過河卒,需要走到目標 b點。卒行走的規則 可以向下 或者向右。同時在棋盤上 c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a 點 0,0 b 點 n,m n,m為不超過 15的整數 同樣馬的位置座標是需要...

馬攔過河卒

如圖,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的整數 同樣...