中国马的跳法

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

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

程序中,以左上角坐标为(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/7564959.html

小X备完后就接着备炮的走,他觉得炮的走相比简单多了。如果有个对方的棋子与炮处于同一行或同一列,并且它们中间只隔了一个棋子,则炮可以吃到这个棋子,俗称“炮打隔子”,中间那个棋子称为炮架,炮架可以是任何一方的棋子。于是小X在作业中增加了炮的吃子难度,小X把中国象棋中的炮的功能做了扩展,扩展到只要在一条直线上炮都能隔着一个棋子打到对方的棋子,这里的直线是指从炮所在的交叉点出发到某个对方棋子所在的交叉点为止画一条直线,如果这条直线中间经过的交叉点上恰好只有一个棋子,则炮就能吃到该对方棋子。为了方便程序处理,小X规定炮的位置固定在左下角即(0,0)的位置上,只需要你计算左下角位置上的炮能吃到几个对方棋子。输入格式 输入数据第一行为一个正整数n,表示棋盘上除了左下角的炮之外共有n个棋子。 接下来共有n行,每行三个整数表示一个棋子的位置和敌我属性。前两个数为棋子的位置,第三个数表示该棋子与炮的关系,0表示它与炮是同一方的,可以做炮架,但不可以被炮吃;1表示它与炮不是同一方的,既可以做炮架,又可以被炮吃。棋子位置的表示与第三题相同。 输入数据保证同一位置只有一个棋子。炮的位置在左下角即(0,0)的位置上,该处保证不会有其它棋子。 输出格式 输出一个整数,表示左下角位置上的炮能吃到的对方棋子的数量。
最新发布
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值