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 }

 

posted @ 2020-03-17 19:43  古比  阅读(155)  评论(0编辑  收藏  举报