马的走法问题

一个 4×5 的棋盘,输入马的起始坐标,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走 字)。  

思想:递归、有时用数组列出全部元素也是个方法、全局变量初始化为0


#include <iostream>
using namespace std;

const int ROWS = 4;//行数
const int COLUMS = 5;//列数
int chess[ROWS][COLUMS];//棋盘
int numCount = 0;
int posX,posY;
int direction[2][8]={{-1,-1,-2,-2,2,2,1,1},{-2,2,1,-1,1,-1,2,-2}}; //马走"日"字

void Solve(int x,int y)
{
    int i,j,desX,desY;
    for (i=0;i<8;++i)
    {
        desX = x+direction[0][i]; //目标位置x坐标
        desY = y+direction[1][i];/ /目标位置y坐标
        if (desX>=0&&desX<4&&desY>=0&&desY<5&&chess[desX][desY]==0)    //检查能走多少步(深度)  for循环是不同方向走的方法(广度)
        {//满足规则,走到目标处,并继续搜索
            chess[desX][desY] = 1;//避免走重复的路线
            Solve(desX,desY);
            chess[desX][desY] = 0;        //++i 后再次确保chess[desx][desy] = 0(先忽略递归)
        }
        else if (desX==posX&&desY==posY)
        {//回到了起点        还有没有回到起点的不用管它们
            numCount++;
        }
    }
}
int main()
{
    cin>>posX>>posY;
    memset(chess,0,sizeof(chess));
    numCount = 0;//走法数
    chess[posX][posY] = 1;//起始步
     Solve(posX,posY);//开始搜索
    cout<<numCount<<endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值