标签:
看到就顺便做了
NOIP2002普及组。那个年代还没有int64,不得不用高精算,然而现在一个long long就解决了。感受到了时代的进步呢。
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
一行四个数据,分别表示B点坐标和马的坐标。
输出格式:一个数据,表示所有的路径条数。
6 6 3 3
6
结果可能很大!
↑不需要高精
30*30的图,暴力动规就行。先把棋盘向右下平移三个单位以防算马控制点时越界。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int mxn=30; 7 long long num[mxn][mxn]; 8 int x,y; 9 int n,m; 10 int mp[mxn][mxn]; 11 int main(){ 12 scanf("%d%d",&n,&m); 13 scanf("%d%d",&x,&y); 14 n+=3;m+=3;x+=3;y+=3; 15 mp[x][y]=1; 16 mp[x-1][y+2]=1; 17 mp[x+1][y+2]=1; 18 mp[x+2][y+1]=1; 19 mp[x+2][y-1]=1; 20 mp[x+1][y-2]=1; 21 mp[x-1][y-2]=1; 22 mp[x-2][y-1]=1; 23 mp[x-2][y+1]=1; 24 num[3][2]=1; 25 for(int i=3;i<=n;i++) 26 for(int j=3;j<=m;j++){ 27 if(!mp[i][j]) 28 num[i][j]=num[i-1][j]+num[i][j-1]; 29 } 30 printf("%lld\n",num[n][m]); 31 return 0; 32 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5642342.html