Time Limit: 3000MS Memory Limit: 65536KB
Problem Description
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。因此稱之爲“馬攔過河卒”。棋盤用座標表示,A點(0,0)、B點(n,m)(n,m爲不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
Input
一行四個數據,用空格分隔,分別表示B點的座標和馬的座標。
Output
一個數據,表示所有的路徑條數。
Example Input
Example Output
Hint
Author
參考代碼
#include<stdio.h>
int main()
{
int bx,by,mx,my;
int i,j;
long long int a[16][16];
int g[16][16];
int dx[9] = {0,-2,-1,1,2,2,1,-1,-2};
int dy[9] = {0,1,2,2,1,-1,-2,-2,-1};
scanf("%d%d%d%d",&bx,&by,&mx,&my);
g[my][mx] = 1;
for( i = 1; i <= 8; i++ )
{
if( ( mx + dx[i] >= 0 ) && ( my + dy[i] >= 0 ) && ( mx + dx[i] <= bx ) && ( my + dy[i] <= by ) )
g[my+dy[i]][mx+dx[i]] = 1;
}
for( i = 0; i <= by; i++ )
{
for( j = 0; j <= bx; j++ )
{
if( j == 0 && i == 0 )
a[i][j] = 1;
else if( g[i][j] == 1 )
a[i][j] = 0;
else
{
if( i == 0 )
a[i][j] = a[i][j-1];
else if( j == 0 )
a[i][j] = a[i-1][j];
else
a[i][j] = a[i-1][j]+a[i][j-1];
}
}
}
printf("%lld\n",a[by][bx]);
return 0;
}