【算法】深度优先 马走日

 在nm的棋盘中,马只能走“日” 字。马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次。找出所有路径。

×××××××××××××

类似问题:

在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字…而且只能往右走…不能向左…可上可下…求从起点到(m, n)处有几种不同的走法。

八皇后。

×××××××××××××

预备知识---》图的深度优先:

https://www.cnblogs.com/OctoptusLian/p/8260173.html

参考代码1:

https://blog.csdn.net/skylv111/article/details/38930213

参考代码2(优先):

https://blog.csdn.net/qq_35654259/article/details/80644714

参考思考(图例):

https://blog.csdn.net/crayondeng/article/details/17174951

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
#define max 101 
 
int count = 0;
int m,n;//棋盘大小
int start_x,start_y;//起点位置
//考虑到马有8种走法
int dx[8]={-2,-1,1,2,-2,-1,2,1};
int dy[8]={-1,-2,-2,-1,1,2,1,2};
int board[max][max]={0};
 
//输出棋盘 
void show(int m,int n){
    for(int i = 0;i<m;i++){
        for(int j = 0;j<n;j++){
            cout<<board[i][j]<<" ";
        }
        cout<<endl;
    }
}
//判断下一步是否是起始的位置 
int next_move(int x,int y){
    for(int i = 0;i<8;i++){
        if(board[x+dx[i]][y+dy[i]] == 1){//1表示马的起始位置
            return 1;
        }
    }
    return 0;
}
//判断是否填了 
int finish(int x,int y){
    if(board[x][y] == 0){//0表示马没有走过 非0表示马已经走过
        return 1;
    }
    return 0;
}
//马的下一步走法已经超出棋盘的范围了
int judge(int x,int y,int m,int n){
    if(x>=0&&x<m&&y>=0&&y<n){
        return 1;
    }
    return 0;
}
//马走的函数
void move(int x,int y,int num){
    if(num == m*n+1&&next_move(x,y)){
        cout<<++count<<endl;
        show(m,n);//输出棋盘 
        cout<<endl;
        return ;
    }else{
        for(int i = 0;i<8;i++){
            if(finish(x+dx[i],y+dy[i])&&judge(x+dx[i],y+dy[i],m,n)){//若不符合上述条件就表示马放弃之后会走这一步了
                board[x+dx[i]][y+dy[i]] = num;//在棋盘上记录马的步数
                move(x+dx[i],y+dy[i],num+1);
                board[x+dx[i]][y+dy[i]] = 0;//当遍历完棋盘后将棋盘重新置为0(表示马为走过) (不过开始位置还是1这里读者慢慢体会)
            }
        }
    }
}
 
 
int main(){
    cout<<"请输入格子数"<<endl;
    cin>>m>>n;
    cout<<"请输入起始的位置"<<endl;
    cin>>start_x>>start_y;
    int number = 1;
    board[start_x][start_y] = number;//将起始位置为1
    
    move(start_x,start_y,number+1);
    cout<<count;
}
//上面的如果还理解不了,可以看这个。
#include <stdio.h>
#include <string.h> int matrix[10][9]; int journey = 1; int step_x[]={1,2,2,1,-1,-2,-2,-1},step_y[]={2,1,-1,-2,-2,-1,1,2}; void outMatrix(){ int i,j; for (i=0;i<10;i++) { for (j=0;j<9;j++) { printf("%-2d ",matrix[i][j]); } printf("\n"); } } bool outofbounds(int x,int y){ return x < 0 || y < 0 || x >= 10 || y >= 9; } bool isCome(int x,int y){ return matrix[x][y]; } void gotoend(int x, int y ){ if(journey>90) return; int i; matrix[x][y]=journey++; //当前是第几步 for (i = 0;i<8;i++) { int next_x = x+step_x[i]; int next_y = y+step_y[i]; if(!outofbounds(next_x,next_y) && !matrix[next_x][next_y]){ gotoend(next_x,next_y); } } } int main(){ int start_x,start_y; int i; scanf("%d%d",&start_x,&start_y); for (i = 0;i<10;i++) { memset(matrix[i],0,sizeof(matrix[0])); } gotoend(start_x,start_y); outMatrix(); return 0; }

猜你喜欢

转载自www.cnblogs.com/paprikatree/p/10530075.html