P1002 过河卒
题意:给出一个n+1*m+1的矩阵,让我们找出从(0,0走到(n,m)的方案数
只能往下或者往右走;
并且马的位置以及马所能走的位置也不能走(马走日)
思路:最简单的DP题;
我们先求出不能走的几个点,用vis数组标记,然后再以此遍历即可;
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=30; 5 ll dp[maxn][maxn]; 6 int vis[maxn][maxn]; 7 int n,m,x,y; 8 void init() 9 { 10 int tmpx,tmpy; 11 tmpx=x-1;tmpy=y-2; 12 if(tmpx>=0&&tmpy>=0) vis[tmpx][tmpy]=1; 13 tmpx=x-2;tmpy=y-1; 14 if(tmpx>=0&&tmpy>=0) vis[tmpx][tmpy]=1; 15 tmpx=x+1;tmpy=y+2; 16 if(tmpx<=n&&tmpy<=m) vis[tmpx][tmpy]=1; 17 tmpx=x+2;tmpy=y+1; 18 if(tmpx<=n&&tmpy<=m) vis[tmpx][tmpy]=1; 19 tmpx=x-1;tmpy=y+2; 20 if(tmpx>=0&&tmpy<=m) vis[tmpx][tmpy]=1; 21 tmpx=x-2;tmpy=y+1; 22 if(tmpx>=0&&tmpy<=m) vis[tmpx][tmpy]=1; 23 tmpx=x+1;tmpy=y-2; 24 if(tmpx<=n&&tmpy>=0) vis[tmpx][tmpy]=1; 25 tmpx=x+2;tmpy=y-1; 26 if(tmpx<=n&&tmpy>=0) vis[tmpx][tmpy]=1; 27 vis[x][y]=1; 28 } 29 int main() 30 { 31 scanf("%d%d%d%d",&n,&m,&x,&y); 32 init(); 33 if(vis[0][0]) printf("0\n"); 34 else{ 35 dp[0][0]=1; 36 for(int i=0;i<=n;i++) 37 for(int j=0;j<=m;j++){ 38 if(vis[i][j]) continue; 39 if(j-1>=0) dp[i][j]+=dp[i][j-1]; 40 if(i-1>=0) dp[i][j]+=dp[i-1][j]; 41 } 42 // for(int i=0;i<=n;i++){ 43 // for(int j=0;j<=m;j++){ 44 // printf("%lld ",dp[i][j]); 45 // } 46 // printf("\n"); 47 // } 48 // for(int i=0;i<=n;i++){ 49 // for(int j=0;j<=m;j++){ 50 // printf("%d ",vis[i][j]); 51 // } 52 // printf("\n"); 53 // } 54 printf("%lld\n",dp[n][m]); 55 } 56 return 0; 57 }