马踏棋盘

马踏棋盘实验报告【回溯法实现】

1、源代码


#include <iostream>
#include<stack>
using namespace std;
typedef struct Node{
    int x;    //x位置
    int y;    //y位置
    int top;   //日字型遍历的位置
}Node;
//输出棋盘
void print(int board[8][8]){
    for(int i=0;i<8;i++) {
        for (int j = 0; j < 8; j++)
            cout << board[i][j]<<"  ";
        cout<<"\n";
    }
}
//日子增量数组
int HTry1[8]={-2,-1,1,2,2,1,-1,-2};
int HTry2[8]={1,2,2,1,-1,-2,-2,-1};
int main() {
    stack<Node> q;   //栈存放路径
    Node temp;
    int board[8][8]={0};  //棋盘,未访问过置0
    int i,j;
    cout<<"输入跳进的位置"<<endl;
    cin>>i>>j;
    temp.x=i;temp.y=j;temp.top=0;    //初值
    int m=0,flag=1;                 //m为日字循环的标志,flag为踏入的次数
    board[temp.x][temp.y]=flag++;
    q.push(temp);                //入栈
    //print(board);
    while(flag<=64){
        for(;m<8;m++) {
            int z=temp.x + HTry1[m];
            int zz=temp.y + HTry2[m];
            if (z>= 0 && z <= 7 && zz>= 0 && zz<=7 && board[z][zz] == 0){
                temp.x=z;
                temp.y=zz;
                break;
            }
        }
        if(m<8){
            board[temp.x][temp.y]=flag++;
            temp.top=m;
            q.push(temp);
            m=0;
        } else{                            //回溯
            board[temp.x][temp.y]=0;
            m=temp.top+1;               //下一个m所开始找的位置
            q.pop();
            temp=q.top();
            flag--;
        }
    }
    print(board);
    return 0;
}

``
*2、输出结果*
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191024224143326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hdGFmZWl5YW5sbA==,size_16,color_FFFFFF,t_70)
*3、解题思路*
	用一个二维数组来存放棋盘,0代表未探测。假设马儿的坐标为(x,y),那么可供选择的下一个位置共有8种可能。是从0号位置(用一个增量数组存放)开始,依次判断新的马儿位置是否可用,不可用的话(即马儿已经走过该位置),则遍历下一个可能的1号位置,直到7号位置停止,如果没有可用位置,则进行回溯(用栈存放路径),如果回溯到了起始位置,则表示此路不通,即无法从该位置开始遍历整个棋盘。如果在遍历0-7号位置的过程中,发现有可用位置,则将该位置坐标赋予(x,y),并将踏入的次序放进棋盘中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值