中国马的跳法

本文介绍了一个关于中国象棋的趣味问题——一匹马如何从半张棋盘的左下角跳到右上角,且仅能向右跳动。通过使用递归回溯算法,详细探讨了所有可能的路径,并最终得出共有37种不同的跳法。

问题:中国象棋的半张棋盘上,马从左下角跳到右上角,总共有几种跳法。

求所有跳法,需要用穷尽搜索,试探法即回溯法是首选。

程序中,以左上角坐标为(0,0),马从左下角(4,0)跳到右上角(0,8)。

马在某个位置,一般而言有8种跳法,但是由于规定只能往右跳,所以只有4种跳法。同时如果跳出棋盘外则回溯。

为了在马跳到目的地后输出结果,使用堆栈存储马跳的轨迹。

总共有37种跳法。

/*
 *
 * 问题描述:在半张中国象棋的棋盘上,一匹马从左下角跳到右上角,只允许往右跳,
 * 给出各种跳法。
 *
 * 跳马问题算法程序
 *
 */

#include <stdio.h>

int stackrow[100];
int stackcol[100];
int ps = 0;

int count = 0;

void horse(int row, int col);
void push(int row, int col);
void pop();
void output_result();

int main(void)
{
    horse(4, 0);

    return 0;
}

/* 函数功能:当前马调到row行col列
 *
 * 参数:row--行,col--列
 */
void horse(int row, int col) {
    push(row, col);
    if(row == 0 && col == 8)
        output_result();
    if(row < 0 || row > 4 || col > 8) {
        ;
    } else {
        horse(row - 2, col + 1);
        horse(row - 1, col + 2);
        horse(row + 1, col + 2);
        horse(row + 2, col + 1);

    }
    pop();
}

void push(int row, int col) {
    stackrow[ps] = row;
    stackcol[ps] = col;
    ps++;
}

void pop() {
    ps--;
}

void output_result() {
    count++;

    int i;
    printf("result %d\n", count);
    for(i=0; i<ps; i++) {
        printf("%2d: %d %d\n", i+1, stackrow[i], stackcol[i]);
    }
    printf("\n");

    getchar();
}


转载于:https://www.cnblogs.com/tigerisland/p/7564958.html

描述 投完篮后小 X 浑身酸爽,心情愉快地备课去了,第一次上课首先要教小朋友们各种棋子的走,并且要设计练习帮助小朋友们巩固记忆,小 X 发现将是第一节课的难点,首先的走很不规则, 它是先沿着直线走一格,然后再沿着斜线走一格,也就是俗称的“走日”,但中国像棋与国际象棋有所不同,首先中国象棋是从一个交叉点上移动到另一个交叉点上,而国际象棋棋子则在方格中移动; 其次,中国象棋的还有“蹩脚”的规则,即如果在前行的道路上有一个棋子(该棋子可以是任意一方的)则称被蹩住脚了,它就不到相应的位置上,这个蹩读“别”,意思为“绊”。下图为的走规则: “走日”的行棋有条规定:先沿直线走一格,然后再沿斜线走一格。每次一个“日”,就是从“日”的一个角走到其对角,不管这个“日”是立着还是横着,只要没有被蹩住脚,它都可以过去。 如图 1 所示,当在棋盘中部的时候,如果没有障碍,最多能够看管住 8 个点,所以人们夸它是“八面威风”。如果到边线上,它的威力就小多了,如图 2 所示,我们看到红在边线上,最多可以看管住 4 个点,减少了一半的管辖范围。如果到角上, 则威力再减半!但是有一个最大的弱点——害怕被“蹩脚”,也叫“绊脚”。一旦脚被蹩,就寸步难行。怎样是“蹩脚” 呢?如果紧邻行进方向的交叉点上有一个棋子(可以是任何一方棋子),就不能过去,这就是“蹩脚” 。如下图中所示: 如果在交叉点 A 处有一枚棋子,则图中的不到 1 和 2 两个交叉点上了;同理如果在交叉点 B 处有一枚棋子,则图中的不到 3 和 4 两个交叉点上了,如果在交叉点 C 处有一枚棋子,则图中的不到 5 和 6 两个交叉点上了,如果在交叉点 D 处有一枚棋子,则图中的不到 7 和 8 两个交叉点上了。 现在小 X 给你一个棋盘上的局面,此局面最多会有两个,并且如果有两个则它们一定是同一方的,另外还有许多别的棋子分布在棋盘上,这些棋子可能是己方的,也可能是对方的,小 X 要你指出有多少个对方的棋子会被吃到,只要是在一步能到的位置上有一个对方的棋子,则就能吃到这个棋子。在象棋规则中任何时候任何棋子都不能吃己方的棋子! C++
最新发布
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值