要么改变世界,要么适应世界

马拦过河卒

2020-05-24 14:21:00
104
目录

题目来源:C语言网1266

问题描述

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入

一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)

输出

一个数据,表示所有的路径条数。

样例输入

6 6 3 5

样例输出

6

问题求解

/*
 * @Author: YaleXin
 * @Date: 2020-05-24 13:34:01
 * @LastEditTime: 2020-05-24 14:16:01
 * @LastEditors: YaleXin
 * @Description:
 * @FilePath: \my_c_workspace\dotcpp\1266.c
 * @祈祷不出现BUG
 */
#include <stdio.h>
/**
 * @x : 马的横坐标  @y : 马的纵坐标
 */
int path[16][16] = {0}, sum = 0, n, m, x, y;
/**
 * 初始化禁区
 */
void setHorse() {
    path[x][y] = 1;
    if ((x - 2) >= 0 && (y - 1) >= 0) path[x - 2][y - 1] = 1;
    if ((x - 1) >= 0 && (y - 2) >= 0) path[x - 1][y - 2] = 1;
    if ((x - 2) >= 0 && (y + 1) <= m) path[x - 2][y + 1] = 1;
    if ((x - 1) >= 0 && (y + 2) <= m) path[x - 1][y + 2] = 1;
    if ((x + 2) <= n && (y - 1) >= 0) path[x + 2][y - 1] = 1;
    if ((x + 1) <= n && (y - 2) >= 0) path[x + 1][y - 2] = 1;
    if ((x + 2) <= n && (y + 1) <= m) path[x + 2][y + 1] = 1;
    if ((x + 1) <= n && (y + 2) <= m) path[x + 1][y + 2] = 1;
}
void findPath(int nowX, int nowY) {
    if (nowX == n && nowY == m) {
        sum++;
        return;
    }
    // 先往右
    if ((nowY + 1) <= m && !path[nowX][nowY + 1]) findPath(nowX, nowY + 1);
    // 再往下
    if ((nowX + 1) <= n && !path[nowX + 1][nowY]) findPath(nowX + 1, nowY);
}
int main() {
    scanf("%d%d%d%d", &n, &m, &x, &y);
    setHorse();
    // 先往右
    if (!path[0][1]) findPath(0, 1);
    // 再往下
    if (!path[1][0]) findPath(1, 0);
    printf("%d", sum);
    return 0;
}
历史评论
开始评论