马的遍历c++实现(附源码)

 【例一-变式】马的遍历:设有一个n*m(2<=n.m<=50)的棋盘,中国象棋"马”自左下角(0,0)往右上角跳。规定只许往右跳,不许往左跳。请你编写程序,输入m,n之后,找出左下角到右上角的可达路径,并输出路径经过的各坐标点,若不可达,则输出no。

输入-1行:                                                                                输入样例:

n,m  表示棋盘规模                                                                     3    3

输出-若干行:                                                                          输出样例:

可行路径经过的坐标点                                                              0,0->1,2->3,3

                                                                                                      0,0->2,1->3,3

#include<bits/stdc++.h>
using namespace std;
int n,m,sum=0;  //棋盘规模n行m列,路径总数初值为0
int b[51][51]={0}; //标记该点是否被使用 
int dx[4]={1,2,2,1};
int dy[4]={2,1,-1,-2};//马走日,存储4个方向的变化 
int ansx[51]={};//x 
int ansy[51]={};//y 
int step=0;//表示现在已经走过的点的数量 
void search(int x,int y)//搜索函数,表示当前搜索到点x,y 
{//到达边界 
	if(x==m&&y==n)
	{//snm++
		for(int i=0;i<step;i++)
		{
			cout<<ansx[i]<<","<<ansy[i]<<"->";
		}
		cout<<ansx[step]<<","<<ansy[step]<<endl;
		return;
	}
	int nx,ny;//选择方向后下一个点的新坐标 
	for(int i=0;i<4;i++)//针对每个点都有4个方向可供选择 
	{
		nx=x+dx[i];
		ny=y+dy[i];//获取下个点的新坐标 
		if(nx>=0&&nx<=m&&ny>=0&&ny<=n&&b[nx][ny]==0)
		{
			b[nx][ny]=1;
			step+=1;
			ansx[step]=nx;
			ansy[step]=ny;
			search(nx,ny);//搜索下一个点 
			b[nx][ny]=0;//回溯 
			step-=1;
		}
	}
}
int main()
{
	cin>>n>>m;
	ansx[0]=0;
	ansy[step]=0;
	search(0,0);//从棋盘经点(0,0)开始搜索
	//cout<<sum; //输出可行路径总数 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值