1. 程式人生 > >18.07.01 luoguP1002 過河卒

18.07.01 luoguP1002 過河卒

假設 string sam 位置 clu ++ using alt lap

題目描述

棋盤上 AA 點有一個過河卒,需要走到目標 BB 點。卒行走的規則:可以向下、或者向右。同時在棋盤上 CC 點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。

棋盤用坐標表示, AA 點 (0, 0)(0,0) 、 BB 點 (n, m)(n,m) ( nn , mm 為不超過 2020 的整數),同樣馬的位置坐標是需要給出的。

現在要求你計算出卒從 AA 點能夠到達 BB 點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入輸出格式

輸入格式:

一行四個數據,分別表示 BB 點坐標和馬的坐標。

輸出格式:

一個數據,表示所有的路徑條數。

輸入輸出樣例

輸入樣例#1:
6 6 3 3
輸出樣例#1:
6

說明

結果可能很大!

技術分享圖片
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <math.h>
 5 
 6 using namespace std;
 7 long long ans;
 8 int  xb, yb, xh, yh;
 9 int
dir1[2] = { 0,1 }, dir2[2] = { 1,0 }; 10 int p1[9] = { 1,-1,2,-2,2,-2,1,-1,0 }, p2[9] = { 2,2,1,1,-1,-1,-2,-2,0 }; 11 long long record[25][25]; 12 13 long long dfs(int x,int y) { 14 if (x == xb && y == yb) 15 { 16 return 1; 17 } 18 if (x > xb || y > yb) 19
return 0; 20 if (record[x][y] != 0) 21 return record[x][y]; 22 long long tmp = 0; 23 for (int i = 0; i <= 1; i++) { 24 int xx = x + dir1[i], yy = y + dir2[i]; 25 bool flag = true; 26 for (int j = 0; j <= 8; j++) { 27 int c1 = xh + p1[j], c2 = yh + p2[j]; 28 if (c1 == xx && c2 == yy) { 29 flag = false; 30 break; 31 } 32 } 33 if (flag) 34 tmp += dfs(xx, yy); 35 } 36 record[x][y] = tmp; 37 return tmp; 38 } 39 40 int main() 41 { 42 scanf("%d%d%d%d", &xb, &yb, &xh, &yh); 43 ans=dfs(0, 0); 44 printf("%lld\n", ans); 45 return 0; 46 }
View Code

註意要dp不然要TLE

註意要所有答案相關的數據類型都要設成 long long ,不然會WA

18.07.01 luoguP1002 過河卒