问题 E: 马的遍历问题

题目描述
在5*4的棋盘中,马只能走斜“日”字。马从位置(x, y)处出发,把棋盘的每一格都走一次,且只走一次,请找出所有路径。
输入
x,y,表示马的初始位置。
输出
将每一格都走一次的路径总数,如果不存在该路径则输出“No solution!”。
在这里插入图片描述

#include<bits/stdc++.h>
#define mCheck(x,y) (x<0||y<0||x>=n||y>=m||a[x][y]!=0)

using namespace std;

int fx[8]= {1,2,2,1,-1,-2,-2,-1};
int fy[8]= {2,1,-1,-2,-2,-1,1,2};

static int mCount;
const static int n=5,m=4;
int a[n][m];


void mFind(int x,int y,int dep)
{
    int xx,yy;
    for(int i=0; i<8; i++)
    {
        xx=x+fx[i];
        yy=y+fy[i];
        if(!mCheck(xx,yy))
        {
            a[xx][yy]=dep;
            if(dep==n*m)
              mCount++;
            else
                mFind(xx,yy,dep+1);
            a[xx][yy]=0;
        }
    }
}


int main()
{
    int x,y;
    while(cin>>x>>y){
    mCount=0;
 memset(a,0,sizeof(a));
    a[x-1][y-1]=1;

    mFind(x-1,y-1,2);

    if(mCount==0)
        cout<<"No solution!"<<endl;
    else
        cout<<mCount<<endl;

}
}

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/106148582