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个点没有过。不知道问题出在哪,请教一下各位大佬,是什么问题?