跳马
问题描述】
有一只中国象棋中的 ” 马 ” ,在半张棋盘的左上角出发,向右下角跳去。规定只许向右跳(可上,可下, 但不允许向左跳)。请编程求从起点 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;//撤销标记
}
}