1. 程式人生 > ><<信息學奧賽一本通>> 過河卒

<<信息學奧賽一本通>> 過河卒

flag == 內存 ios 內存限制 spa 問題 三目運算符 運算符

1314:【例3.6】過河卒(Noip2002)


時間限制: 1000 ms 內存限制: 65536 KB
提交數: 4212 通過數: 1741

【題目描述】

棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的某一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點,如圖3-1中的C點和P1,……,P8,卒不能通過對方馬的控制點。棋盤用坐標表示,A點(0,0)、B點(n, m) (n,m為不超過20的整數),同樣馬的位置坐標是需要給出的,C≠A且C≠B。現在要求你計算出卒從A點能夠到達B點的路徑的條數。

技術分享圖片

【輸入】

給出n、m和C點的坐標。

【輸出】

從A點能夠到達B點的路徑的條數。

【輸入樣例】

8 6 0 4

【輸出樣例】

1617

公式好推.

數組出界問題

(1) 我是在外面多加了一圈。

不過看了下 LG 的題解,
原來可以用 三目運算符 來保證不出界

(2) a[i == 0 ? i : i-1][j]

馬的控制點判斷
(1) 可以用數組[][] 當地圖,把有馬控制的地方變為1 來判斷,(用空間換時間)。
(2) (i==mx+1||i==mx-1)&&(k==my+2||k==my-2) (i,j) 為 重點, (mx,my) 馬所處的位置。

自己寫的:
#include<iostream>
using namespace std;

    int n,m,cx,cy;
    long long step[25][25] = {0};
    int h[9][2];
    int insX[] = {2,2,-2,-2,1,1,-1,-1},
        insY[] = {1,-1,1,-1,2,-2,2,-2};
    bool flag = false;
    
int main() {
    
    cin >> n >> m >> cx >> cy;
    
//HORSE h[0][0] = cx+1,h[0][1] = cy+1; for(int i=0;i<8;i++){ h[i+1][0] = h[0][0] + insX[i]; h[i+1][1] = h[0][1] + insY[i]; } //STEP step[1][1]=1; for(int i=1; i<= n+1; ++i) { for(int j=1; j<= m+1; ++j) { if( i!=1 || j!=1){ for(int k=0;k<9;++k){ if(i==h[k][0] && j==h[k][1]){ flag = true; } } if(!flag){ step[i][j] = step[i-1][j] + step[i][j-1]; } flag = false; } } } cout << step[n+1][m+1] << endl; }

 

<<信息學奧賽一本通>> 過河卒