洛谷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 }

 

posted @ 2015-08-22 08:41  AI_Believer  阅读(305)  评论(0编辑  收藏  举报