跳马问题~!@#¥%……

在n×m棋盘上有一中国象棋中的马,规定:

  1. 马走日字;
  2. 马只能往右走。
    要求马可以从棋盘的左下角(1,1)走到右上角(n,m)。请你编写程序,输出一条可行的路径。
    输入
    输入两个正整数n和m,表示棋盘的大小为n*m。
    输出
    输出一条可行的路径,用行列下标表示,并用“->”连接。
    样例输入 Copy
    9 5
    样例输出 Copy
    (1,1)->(3,2)->(5,1)->(6,3)->(7,1)->(8,3)->(9,5)

思路:深度搜索(因为某些原因,我的结果与样例不符,但我程序所显示的路径也是可行的)另:我的程序有注释,您应该能看明白;您如果对我的程序有不明白的,欢迎问我!

#include<iostream>
using namespace std;
int n,m,a[105][3],visit[70][70],step=1;
int fx[5]={0,-1,-2,2,1},fy[5]={0,-2,-1,1,2};
void dfs(int x,int y)
{
    if(x==m&&y==n)
    {
        for(int i=1;i<=step-2;i++)
        {
            cout<<"("<<a[i][1]<<","<<a[i][2]<<")->";//按照输出格式 
        }
        cout<<"("<<x<<","<<y<<")";
        exit(0);//强制结束程序 
    }
    for (int i=1;i<=4;i++)
    {
        int    nx=x+fx[i],ny=y+fy[i];//下一步可能在此点 
        if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&visit[nx][ny]==0)//判断是否可以继续走 
        {
            a[step][1]=nx;
            a[step][2]=ny;//记录步骤 
            step++;
            visit[nx][ny]=1;//标记,防止重复 
            dfs(nx,ny);//dg(递归) 
            visit[nx][ny]=0;
            step--;
        }
 
    }
    
}
int main()
{
    cin>>m>>n;
    a[step][1]=1;
    a[step][2]=1;
    step++;
    visit[1][1]=1;
    dfs(1,1);
}

这个无非就是求这个过程中马走上偏右(1,2)和右偏上(2,1)的个数x,y。

1+x+2y=m
1+2x+y=n

这个你总会求咯,然后反正顺序不影响,图简单,前x次+(1,2)后y次+(2,1)即可,很简单