P1002递归解法,测试点3过不了,什么问题
  • 板块学术版
  • 楼主Loopbreak
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/3/22 12:47
  • 上次更新2024/3/22 16:46:24
查看原帖
P1002递归解法,测试点3过不了,什么问题
969943
Loopbreak楼主2024/3/22 12:47

P1002过河卒问题,不考虑DP方程解法。 尝试递归去做。测试点3就是不对,也不知道具体错哪里了。

#include <bits/stdc++.h>
using namespace std;

long long dp[20][20];   //记忆化

//这个函数用来判断当前格子是否与马冲突了
bool ism(vector<int> &mx, vector<int> &my, int x, int y) {
	for (int i = 0; i < mx.size(); i++) {
		if (x == mx[i] && y == my[i]) return true;
	}	
	return false;
}


long long f(int bx, int by, vector<int> &mx, vector<int> &my, int beginx, int beginy) {
	if (dp[beginx][beginy] != -1) return dp[beginx][beginy];   //记忆化返回
	if (beginx == bx && beginy == by) {   //如果走到终点就返回1,表示是合法路径
		return 1;
	}	
	if (beginx > bx || beginy > by || ism(mx,my,beginx,beginy)) return 0;   //如果x,y位置越界或者遇到马的点 说明不合法,返回0
	long long d = 0, r = 0;   //向下走的方案和向右走的方案
	r += f(bx,by,mx,my,beginx+1, beginy);   //向右走的方案
	d += f(bx,by,mx,my,beginx, beginy + 1);  //向下走的方案
	dp[beginx][beginy] = d + r;   //总方案就是2者相加
	return dp[beginx][beginy];   //返回答案
}

int main() {
	int bx,by,mx,my;
	cin >> bx >> by >> mx >> my;
	vector<int> allmx,allmy;  //定义马格子的动态数组
	
	memset(dp,-1,sizeof(dp));
	allmx.push_back(mx);  //先把马当前点放里面
	allmy.push_back(my);
	int tempx[8] = {1,2,2,1,-1,-2,-2,-1};   //马的移动数组
	int tempy[8] = {2,1,-1,-2,-2,-1,1,2};
	for (int i = 0; i < 8; i++) {
		if (mx + tempx[i] < 0 || mx + tempx[i] > bx || my + tempy[i] < 0 || my + tempy[i] > by) {  //如果马移动后不在合法位置就跳过
			continue;
		}
		allmx.push_back(mx + tempx[i]);//如果合法就把马位置加进去
		allmy.push_back(my + tempy[i]);
	} 

	cout << f(bx,by,allmx,allmy,0,0);  //算0.0位置到bx,by位置的方案数
	return 0;
}

5个点,只有1个点没有过。不知道问题出在哪,请教一下各位大佬,是什么问题?

2024/3/22 12:47
加载中...