【例一-变式】马的遍历:设有一个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;
}