<<信息學奧賽一本通>> 過河卒
阿新 • • 發佈:2019-03-02
flag == 內存 ios 內存限制 spa 問題 三目運算符 運算符
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 4212 通過數: 1741
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;
}
<<信息學奧賽一本通>> 過河卒