P1002 过河卒

题目链接:https://www.luogu.com.cn/problem/P1002

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int bx, by, mx, my;
 4 long long f[25][25];  //f[x][y]表示从A点到达(X,Y)点的路径数,注意数据范围要long long 
 5 int m[8][2]={{-1,-2},{-2,-1},{-1,2},{-2,1},{1,-2},{2,-1},{1,2},{2,1}};  //马的控制点
 6 int main()
 7 {
 8     cin>>bx>>by>>mx>>my;   //输入数据 B点坐标和马的坐标 
 9     
10     //马的控制点全部设置成-1 
11     f[mx][my]=-1;//别忘了马本身也要设置为-1 
12     for(int i=0; i<8; i++){
13         int nx=mx+m[i][0];
14         int ny=my+m[i][1];
15         if(nx>=0 && nx<=bx && ny>=0 && ny<=by)//判断是否超出范围 
16             f[nx][ny]=-1;
17     }
18     
19     f[0][0]=1;  //A点存放值为1 
20     for(int x=1; x<=bx; x++){//初始化X轴上所有点的f[x][y]值 
21         if(f[x][0]==-1){     //遇到马的控制点设置为0 
22             f[x][0]=0;
23             continue;    
24         }
25         f[x][0]=f[x-1][0];
26     }
27     for(int y=1; y<=by; y++){//初始化Y轴上所有点的f[x][y]值 
28         if(f[0][y]==-1){     //遇到马的控制点设置为0
29             f[0][y]=0;
30             continue;
31         }
32         f[0][y]=f[0][y-1];
33     }
34     
35     //测试代码 
36 //    for(int x=0; x<=bx; x++){
37 //        for(int y=0; y<=by; y++){
38 //            cout<<setw(4)<<f[x][y]<<" ";
39 //        }
40 //        cout<<endl;
41 //    }
42         
43     
44     for(int x=1; x<=bx; x++)
45         for(int y=1; y<=by; y++)
46         {
47             if(f[x][y]==-1){    //遇到马的控制点设置为0
48                 f[x][y]=0; 
49                 continue;
50             }
51             f[x][y]=f[x-1][y]+f[x][y-1];
52         }
53         
54     cout<<f[bx][by];
55     
56     return 0;
57 }
58 // 4 8 2 4
原文地址:https://www.cnblogs.com/tflsnoi/p/13497857.html