洛谷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 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 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 }