问题描述:
棋盘上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>
#include <string.h>
#define N 21
/*以(x, y)为中心自上而下,自左至右*/
int row[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
int col[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
void printResult(int A[][N], int n, int m)
{
int i, j;
for (i=0; i<=n; ++i)
{
for (j=0; j<=m; ++j)
{
printf("%d ", A[i][j]);
}
printf("\n");
}
}
void getHorseControl(int horse[][N], int n, int m, int x, int y)
{
int k, i, j;
horse[x][y] = 1;
for (k=0; k<8; ++k)
{
i = x + row[k]; /*行坐标*/
j = y + col[k]; /*列坐标*/
if ((0<=i && i<=n) && (0<=j && j<=m))
{
horse[i][j] = 1;
}
}
}
void getResult(int dp[][N], int horse[][N], int n, int m)
{
int i, j;
dp[0][0] = 1;
/*初始化边界*/
for (i=1; i<=n; ++i)
{
if (horse[i][0] == 0)
{
dp[i][0] = dp[i-1][0] ;
}
}
for (j=1; j<=m; ++j)
{
if (horse[0][j] == 0)
{
dp[0][j] = dp[0][j-1];
}
}
for (i=1; i<=n; ++i)
{
for (j=1; j<=m; ++j)
{
if (horse[i][j] == 0) /*不在马的控制区*/
{
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
}
int main(void)
{
int n, m, x, y;
while (scanf("%d%d%d%d", &n, &m, &x, &y) != EOF)
{
int horse[N][N], dp[N][N];
memset(horse, 0, sizeof(horse));
memset(dp, 0, sizeof(dp));
getHorseControl(horse, n, m, x, y);
getResult(dp, horse, n, m);
printResult(horse, n, m);
printf("\n");
printResult(dp, n, m);
}
return 0;
}