1002-过河卒-洛谷-luogu-动态规划dp
题目描述
棋盘上AA点有一个过河卒,需要走到目标BB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,AA点(0, 0)(0,0)、BB点(n, m)(n,m)(nn, mm为不超过2020的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入输出格式
输入格式:
一行四个数据,分别表示BB点坐标和马的坐标。
输出格式:
一个数据,表示所有的路径条数。
输入输出样例
说明
结果可能很大!
--------------------------------------------------------------------------------------------------
假设马的位置是固定不动的,并不是卒走一步马走一步。
看到这句话了嘛!
这说明马所能到达地地方是有限的!!!
并不是哪都能到达的
说明
结果可能很大!
这明显的暗示我们嘛,肯定不能深搜宽搜啊,是会爆掉的
(以上即为我没有注意到的)
-------------------------------------------------------------------------------------------
#include<cstdio> #include<cstring> using namespace std; typedef unsigned long long ull; ull f[50][50]; //初值为0 int a[12]={0,-1,-2,-2,-1,1,2,2,1,0}; //矩阵 int b[12]={0,2,1,-1,-2,-2,-1,1,2,0}; int tx,ty; int hx,hy; bool d[50][50]; int main(){ memset(d,false,sizeof d); //用来标记 scanf("%d%d%d%d",&tx,&ty,&hx,&hy); tx++,ty++,hx++,hy++; //同一为起点为1,1的网格 for(int i=1;i<=9;i++){ if(hx+a[i]>0 && hy+b[i]>0) d[hx+a[i]][hy+b[i]]=true; //把马能到的地方标记 } f[1][1]=1; //起点到起点的方案数为1 for(int i=1;i<=tx;i++) { for(int j=1;j<=ty;j++) { if(i==1 && j==1) continue; //已赋值 if(d[i][j]) //被标记过的 即为马能到的地方 走不了 continue; f[i][j]=f[i-1][j]+f[i][j-1]; } } printf("%lld",f[tx][ty]); return 0; }
(加油)