過河卒(NOIP2002初中組複賽第四題)
問題描述: 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下或向右。 同時在棋盤上的任一點有一個對方的馬(如圖中的C點),該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。例如圖中C點上的馬可以控制9個點。卒不能走到對方馬的控制點。 棋盤用座標表示,A點座標(0,0)、B點座標(n, m) (n,m爲不超過20的整數,並由鍵盤輸入),同樣馬的位置座標C是需要給出的(C≠A,且C≠B)。現在要求你計算出卒從A點能夠到達B點的路徑條數。
輸入:B點的座標(n, m)以及對方馬的座標(x,y),不用判錯。
輸出:一個整數(路徑的條數)。
樣例:
輸入:6 6 3 2
輸出:17
源代碼:
#include<stdio.h>
int s[21][21];
__int64 c[21][21];
int a0[8]={-2,-2,-1,-1,1,1,2,2};
int b0[8]={1,-1,2,-2,2,-2,1,-1};
int x1,y1;
int x3,y3;
int main()
{
int x2,y2;
int i,j;
int test;
while((scanf("%d %d %d %d",&x1,&y1,&x3,&y3)!=EOF))
{
for(i=0;i<21;i++)
for(j=0;j<21;j++)
{
s[i][j]=1;
c[i][j]=0;
}
s[x3][y3]=0;
for(i=0;i<8;i++)//計算受馬控制的點
{
x2=x3+a0[i];
y2=y3+b0[i];
if((x2>=0)&&(y2>=0)&&(y2<=20)&&(x2<=20))
s[x2][y2]=0;
}
test=1;
for(j=0;j<21;j++)//初始化邊上的走法
{
if(test)
{
if(s[0][j]==0)
test=0;
else
c[0][j]=1;
}
}
test=1;
for(j=0;j<21;j++)
{
if(test)
{
if(s[j][0]==0)
test=0;
else
c[j][0]=1;
}
}
for(i=1;i<21;i++)//計算一個點上的走法,上方點的走法數+左方點的走法數
for(j=1;j<21;j++)
{
if(s[i][j])
c[i][j]=c[i-1][j]*s[i-1][j]+c[i][j-1]*s[i][j-1];
}
printf("%I64d\n",c[x1][y1]);
}
return 0;
}
附:程序源代碼