棋盤上
�
A 點有一個過河卒,需要走到目標
�
B 點。卒行走的規則:可以向下、或者向右。同時在棋盤上
�
C 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用座標表示,
�
A 點
(
0
,
0
)
(0,0)、
�
B 點
(
�
,
�
)
(n,m),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從
�
A 點能夠到達
�
B 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入格式
一行四個正整數,分別表示
�
B 點座標和馬的座標。
輸出格式
一個整數,表示所有的路徑條數。
include
include
include
using namespace std;
const int N = 100;
bool a[N][N];
bool g[N][N];
int b[N][N];
long long f[N][N];
int main()
{
int n, m, x2, y2;
cin >> n >> m >> x2 >> y2;//n,m:b點座標,馬的位置。
int dx[] = {-1,-2,-2,-1,1,2,2,1};//偏移量
int dy[] = {-2,-1,1,2,-2,-1,1,2};
g[x2][y2] = true;//將馬的位置設為1
for (int i = 0; i < 8; i++)
{
int t = x2 + dx[i], p = y2 + dy[i];//計算馬可能的位置
if (t >= 0 && t <= n && p >= 0 && p <= m) g[t][p] = true;//將可能位置設為1.
}
f[0][0] = 1;
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= m; j++)
{
if (g[i][j] == false)//當馬到不了
{
if (i) f[i][j] += f[i-1][j];//到{i,j}點的所有路徑數=從{i-1,j}點的路徑數之和以及到{i,j-1}點的路徑數之和
if (j) f[i][j] += f[i][j-1];
}
}
}
cout << f[n][m];輸出所有路徑數。
return 0;
}