題目描述
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。因此稱之爲“馬攔過河卒”。
棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m爲不超過20的整數),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入輸出格式
輸入格式:
一行四個數據,分別表示B點座標和馬的座標。
輸出格式:
一個數據,表示所有的路徑條數。
輸入輸出樣例
輸入樣例#1:
6 6 3 3
輸出樣例#1:
6
說明
結果可能很大!
遞推
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int b[105][105];
long long f[105][105];
long long e,d,p,q;
int main()
{
cin>>e>>d>>p>>q;
b[p][q]=1;
for(int i=-2;i<=2;i++)
for(int j=-2;j<=2;j++)
{
if(abs(i)!=abs(j) && i!=0 && j!=0 && p+i>=0 && q+j>=0)
b[p+i][q+j]=1;
}
f[0][0]=1;
for(int i=0;i<=e;i++)
for(int j=0;j<=d;j++)
{
if(i>=1 && !b[i-1][j] )
f[i][j]+=f[i-1][j];
if(j>=1 && !b[i][j-1] )
f[i][j]+=f[i][j-1];
}
cout<<f[e][d]<<endl;
return 0;
}
動態規劃
#include<iostream>
using namespace std;
long long f[25][25];
int dx[8]={1,1,-1,-1,2,2,-2,-2},
dy[8]={2,-2,2,-2,1,-1,1,-1};
int n,m,x,y;
int main()
{
cin>>n>>m>>x>>y;
f[x][y]=-1;
for(int i=0;i<8;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0 && xx<=n && yy>=0 && yy<=m)
f[xx][yy]=-1;
}
if(f[0][0]!=-1)
{
f[0][0]=1;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
if(f[i][j]!=-1)
{
if(i>=1&&f[i-1][j]!=-1)
f[i][j]+=f[i-1][j];
if(j>=1&&f[i][j-1]!=-1)
f[i][j]+=f[i][j-1];
}
cout<<f[n][m]<<endl;
}
else
cout<<0<<endl;
}