C:“走马”的路径问题(回溯)

前言

递归回溯问题,不是马踏棋盘

正文

有一个中国象棋中的“马”,在半张棋盘的左上角出发,右下角跳去。规定只允许向右跳(可上,可下,但不允许向左跳)求从起点A(1,1)到终点B(m,n)共有多少种不同的跳法
分析:和dfs找多条路径类似,但是限定了“马”的走向和边界,用两个数组dx[4],dy[4]控制每次走的方向,找到一条路径后返回,回溯的时候把经过的点置0,因为一个点又多条路径可选,可以继续找该点的另条到达终点的路径。
图的多条简单路径

代码

#include <stdio.h>
static int chessboard[5][9]={0};	//储存半个棋盘的二维数组 
static int count=0;
const int dx[4]={2,1,-1,-2};//横坐标的变化 
const int dy[4]={1,2,2,1};	//纵坐标的变化 
void horse_count(int srcx,int srcy,int destx,int desty){
	if(srcx>=0&&srcx<5&&srcy>=0&&srcy<9&&chessboard[srcx][srcy]==0){	//规定边界和不重复路线
		if(srcx==destx-1&&srcy==desty-1){	//达到目的地 
			count++;						//次数加1,返回 
			return ;
		}
		chessboard[srcx][srcy]=1;			//标记走过的点 
		int i;
		for(i=0;i<4;i++){					//四个方向依次进行dfs搜索 
			horse_count(srcx+dx[i],srcy+dy[i],destx,desty);				 
		}
		chessboard[srcx][srcy]=0;			//回溯置0可以接着找其他路径 
	}
} 
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	horse_count(0,0,m,n);
	printf("%d",count);
	return 0;
}

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值