洛谷1002 过河卒
洛谷1002 过河卒
本题地址: http://www.luogu.org/problem/show?pid=1002
题目描述
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入输出格式
输入格式:
一行四个数据,分别表示B点坐标和马的坐标。
输出格式:
一个数据,表示所有的路径条数。
输入输出样例
输入样例#1:
6 6 3 3
输出样例#1:
6
说明
结果可能很大!
题解:这题题意不明,最后调了半天,,,(控制点根本没说明白是什么意思啊)。。。
不过特别逗,我上来竟然写的是BFS爆搜!。。。。。无语了。。。
爆炸之后写了一发记忆化,发现我是从(0,0)开始搜的= =
完了窝的代码能力真的喂狗咯。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<stack> 6 #include<queue> 7 #include<cstring> 8 #define PAU putchar(' ') 9 #define ENT putchar('\n') 10 #define MSE(a,b) memset(a,b,sizeof(a)) 11 #define REN(x) for(ted*e=fch[x];e;e=e->nxt) 12 #define TIL(x) for(int i=1;i<=x;i++) 13 #define ALL(x) for(int j=1;j<=x;j++) 14 using namespace std; 15 const int maxn=20+10; 16 const int dx[]={0,-1,0}; 17 const int dy[]={0,0,-1}; 18 const int cx[]={0,0,2,1,-1,-2,1,-1,2,-2}; 19 const int cy[]={0,0,1,2,-2,-1,-2,2,-1,1}; 20 bool vis[maxn][maxn]; 21 long long dp[maxn][maxn]; 22 long long ans=0;int n,m; 23 long long dfs(int x,int y){ 24 long long&res=dp[x][y];if(x==1&&y==1)return res=1;if(vis[x][y])return 0;if(res!=-1)return res; 25 long long tmp=0;TIL(2){int tx=x+dx[i],ty=y+dy[i]; 26 if(tx&&ty)tmp+=dfs(tx,ty); 27 }return res=tmp; 28 } 29 inline int read(){ 30 int x=0;bool sig=true;char ch=getchar(); 31 for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=false; 32 for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';return sig?x:-x; 33 } 34 inline void write(long long x){ 35 if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; 36 int len=0;static long long buf[20];while(x)buf[len++]=x%10,x/=10; 37 for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; 38 } 39 int x,y; 40 int main(){ 41 n=read()+1;m=read()+1;x=read()+1;y=read()+1; 42 memset(dp,-1,sizeof(dp)); 43 TIL(9){int tx=x+cx[i],ty=y+cy[i]; 44 if(tx&&ty&&tx<=n&&ty<=m)vis[tx][ty]=true; 45 }write(dfs(n,m)); 46 return 0; 47 }