プッシュバック-L-馬が川を止めて卒

29587 ワード

タイトル:
Description
碁盤のA点には川を渡る卒がいて、目標のB点まで歩く必要があります.歩行のルール:下へ、または右へ.同時に碁盤上のC点には相手の馬があり、その馬がいる点とジャンプして一歩で達する点を相手の馬の制御点と呼ぶ.そのため「馬が川を渡る卒」と呼ばれている.碁盤は座標で表され、A点(0,0)、B点(n,m)(n,mは15を超えない整数)であり、同じ馬の位置座標が与えられる必要がある.今、卒がA点からB点に到達できる経路の条数を計算し、馬の位置が固定されていると仮定し、卒走一歩馬が一歩歩くわけではない.
Input
1行に4つのデータをスペースで区切って、B点の座標と馬の座標をそれぞれ表します.
Output
すべてのパス・バー数を表すデータ.
Sample Input
6 6 3 3

Sample Output
6

問題解決の考え方:
この问题は私が自分で作ったのではありませんて、その时ただ马の周囲が8つの点があることを思い付いて歩くことができなくて、しかしどのように総括的なルートを求めますところが考えがなくて、仕方なくネット上で解答を探して、见终わってやっとこの问题が授业の中の金貨を食べるゲームの解答の考えと同じであることを発见して、すべての点のルートの個数はそれの左と上の個数の和に等しくて、碁盤全体の境界を判断しないと境界を越えることに注意してください.
#include 
using namespace std;
int a[21][21] = {0};
void soldier(){
    int i, j, m, n, x, y;
    cin >> n >> m >> x >> y;
    if(true){
        a[x][y] = -1;
        if(x - 1 >= 0 && y - 2 >= 0) a[x-1][y-2] = -1;
        if(x - 2 >= 0 && y - 1 >= 0) a[x-2][y-1] = -1;
        if(x - 2 >= 0 && y + 1 <= m-1) a[x-2][y+1] = -1;
        if(x - 1 >= 0 && y + 2 <= m-1) a[x-1][y+2] = -1;
        if(x + 1 <= n && y + 2 <= m) a[x+1][y+2] = -1;
        if(x + 2 <= n && y + 1 <= m) a[x+2][y+1] = -1;
        if(x + 2 <= n && y - 1 >= 0) a[x+2][y-1] = -1;
        if(x + 1 <= n && y - 2 >= 0) a[x+1][y-2] = -1;
    }

    for(i = 0; i <= n; i++){
        for(j = 0; j <= m; j++){
            if(a[i][j] == -1) continue;
            if(i == 0 && j == 0) {a[i][j] = 1;continue;}
            a[i][j] = 0;
            if(j-1 >= 0 && a[i][j-1] != -1)
                a[i][j] += a[i][j-1];
            if(i-1 >= 0 && a[i-1][j] != -1)
                a[i][j] += a[i-1][j];
            if(a[i][j] == 0) a[i][j] = -1;

        }
    }
    if(a[n][m] == -1) cout << 0;
    else cout << a[n][m];
}

int main(){
    soldier();
    return 0;
}
レビュー:
この問題は結局自分で作ったものではないので、今度似たようなものに出会ったら二度としないことを望んでいます.