马踏棋盘实验报告【回溯法实现】
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),并将踏入的次序放进棋盘中。