P1002 [NOIP 2002 普及组] 过河卒

思路整体向下向右平均2个单位,这样就不用考虑越界问题了。

最大值20,所以开数组时,下标开到25就行。

由于产生的数可能非常大,dp数组的值要用 long long.

统一坐标。

c 复制代码
#include <stdio.h>
#define N 24

typedef struct post {
	int x; //水平
	int y; //垂直
}post;

int arr[N][N] = {0};
post a, b, c;
long long  dp[N][N];   //dp[i][j] 指的是到i j位置时,经过的数量
int main()
{
	int tmp = scanf("%d%d%d%d", &b.x, &b.y, &c.x, &c.y);
	// 整体向下,向右平移2个单位
	a.x = 2;
	a.y = 2;
	b.x += 2;
	b.y += 2;
	c.x += 2;
	c.y += 2;


	//根据马的位置,把相关位置堵死
	arr[c.x][c.y] = 1;

	arr[c.x - 2][c.y - 1] = 1;
	arr[c.x + 2][c.y - 1] = 1;
	arr[c.x - 2][c.y + 1] = 1;
	arr[c.x + 2][c.y + 1] = 1;
	arr[c.x - 1][c.y - 2] = 1;
	arr[c.x + 1][c.y - 2] = 1;
	arr[c.x - 1][c.y + 2] = 1;
	arr[c.x + 1][c.y + 2] = 1;

	//dp初始化
	dp[a.x][a.y] = 1;
	for (int i = 2; i <= b.x; i++) {
		for (int j = 2; j <= b.y; j++) {
			if (i == 2 && j == 2) {
				continue;
			}
			if (arr[i][j] == 0) {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
			}
			else {
				dp[i][j] = 0;
			}

			//printf("%lld ", dp[i][j]);
		}
		//printf("\n");
	}
	printf("%lld", dp[b.x][b.y]);
	return 0;
}
c 复制代码
#include <stdio.h>
#include <string.h>
#define N 24

typedef struct post {
    int x; //水平
    int y; //垂直
} post;

int arr[N][N];
post a, b, c;
long long dp[N][N];   //dp[i][j] 指的是到i j位置时,经过的数量

int main() {
    // 输入数据
    scanf("%d%d%d%d", &b.x, &b.y, &c.x, &c.y);

    // 整体向下,向右平移2个单位
    a.x = 2;
    a.y = 2;
    b.x += 2;
    b.y += 2;
    c.x += 2;
    c.y += 2;


    // 初始化arr和dp数组为0
    memset(arr, 0, sizeof(arr));
    memset(dp, 0, sizeof(dp));

    // 标记马的控制点
    arr[c.x][c.y] = 1;
    int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};
    int dy[] = {-1, 1, -2, 2, -2, 2, -1, 1};
    for (int k = 0; k < 8; k++) {
        int nx = c.x + dx[k];
        int ny = c.y + dy[k];
        if (nx >= 0 && nx < N && ny >= 0 && ny < N) {
            arr[nx][ny] = 1;
        }
    }

    // dp初始化
    dp[a.x][a.y] = 1;
    for (int i = a.x; i <= b.x; i++) {
        for (int j = a.y; j <= b.y; j++) {
            if (i == a.x && j == a.y) {
                continue;
            }
            if (arr[i][j] == 0) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            } else {
                dp[i][j] = 0;
            }
        }
    }
    printf("%lld\n", dp[b.x][b.y]);
    return 0;
}