#3 WA, 不是long long的问题
查看原帖
#3 WA, 不是long long的问题
179254
dingdaxia666楼主2025/6/19 16:07
// P1002 [NOIP 2002 普及组] 过河卒

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INDEX(i, j) ((j) + (i) * w)
#define AT(i, j) p[INDEX(i, j)]
#define INBOUND(i, j) (i) <= n && (j) <= m

int main()
{
	unsigned n, m, hi, hj;
	scanf("%u %u %u %u", &n, &m, &hi, &hj);
	unsigned w = m + 1;
	unsigned s = (n + 1) * w;
	unsigned* p = malloc(s * sizeof(unsigned));
	if (!p) return -1;
	memset(p, 255, s * sizeof(unsigned));
	AT(0, 0) = 1;
	if (INBOUND(hi, hj)) AT(hi, hj) = 0;
	if (INBOUND(hi + 2, hj + 1)) AT(hi + 2, hj + 1) = 0;
	if (INBOUND(hi + 1, hj + 2)) AT(hi + 1, hj + 2) = 0;
	if (INBOUND(hi - 1, hj + 2)) AT(hi - 1, hj + 2) = 0;
	if (INBOUND(hi - 2, hj + 1)) AT(hi - 2, hj + 1) = 0;
	if (INBOUND(hi - 2, hj - 1)) AT(hi - 2, hj - 1) = 0;
	if (INBOUND(hi - 1, hj - 2)) AT(hi - 1, hj - 2) = 0;
	if (INBOUND(hi + 1, hj - 2)) AT(hi + 1, hj - 2) = 0;
	if (INBOUND(hi + 2, hj - 1)) AT(hi + 2, hj - 1) = 0;
	for (unsigned j = 1; j < w; ++j) if (AT(0, j)) AT(0, j) = AT(0, j - 1);
	for (unsigned i = 1; i <= n; ++i) for (unsigned j = 0; j < w; ++j) {
		if (AT(i, j)) {
			if (j == 0) AT(i, j) = AT(i - 1, j);
			else AT(i, j) = AT(i - 1, j) + AT(i, j - 1);
		}
	}
	printf("%u", AT(n, m));
	free(p);
	return 0;
}

2025/6/19 16:07
加载中...