dfs跳马问题

跳马
问题描述】
有一只中国象棋中的 ” 马 ” ,在半张棋盘的左上角出发,向右下角跳去。规定只许向右跳(可上,可下, 但不允许向左跳)。请编程求从起点 A(1,1) 到终点 B(m,n) 共有多少种不同跳法。

【输入格式】
输入文件只有一行,两个整数m和n(1<=m,n<=20),两个数之间有一个空格。
【输出格式】
输出文件只有一个整数,即从 A 到 B 全部的走法。
【输入输出样例】
输入数据:
5 9
输出数据:
37
测试输入 期待的输出 时间限制 内存限制 额外进程

测试用例 1
6 10 74 1秒 64M 0
测试用例 2
7 10 100 1秒 64M 0
测试用例 3
6 11 211 1秒 64M 0

#include<stdio.h>
int vst[30][30];//记录下过的着法
void dfs(int x, int y);  
int sum = 0;//记录总数
int m, n; //终点坐标
int main()
{
    printf("请输入m,n的值");
    scanf("%d%d", &n, &m);//输入终点坐标
    dfs(1, 1);//起点(1,1)
    printf("%d", sum);
}
void dfs(int x, int y)
{
    if( x == m && y == n )//如果(x,y) 与终点坐标(m,n)吻合,sum自加并return上一个结点
    {
        sum++;
        return;
    }
    if( vst[x][y] || x < 1 || x > m || y < 1 || y > n )//判断是否这么下过,和是否出界,通俗来说是否撞墙,如果撞墙则return上一个结点
    {
        return ;
    }
    else    {
        vst[x][y] = 1;//如果没有撞墙则把该结点先标记为已经访问过

        dfs( x + 1, y + 2 );//递归调用每一个结点往下能走的四种走法,(因为题干要求只能向右跳所以只有这四种走法)
        dfs( x + 1, y - 2 );
        dfs( x + 2, y + 1 );
        dfs( x + 2, y - 1 );
        vst[x][y] = 0;//撤销标记
    }
}
    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/print_lzp/article/details/81254917
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞