回溯法求马的遍历问题

#include<stdio.h>
void find(int x,int y,int dep);
void output();
int check(int,int);
int  n=5,m=4;
int  fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]={2,1,-1,-2,-2,-1,1,2},a[5][4];
int dep,x,y,count;
void main()
{ 
    int i,j;
    count=0;     
    dep=1;
    printf("请输入x y的坐标: ");    
    scanf("%d%d",&x,&y);
    if (x>=n||y>=m||x<0||y<0) 
    {  
        printf("输入的坐标有误,请重新输入:\n");    
        scanf("%d%d",&x,&y);
    }
    for(i=0;i<n;i++)  
        for(j=0;j<m;j++)  
            a[i][j]=0;

    a[x][y]=1;
    find(x,y,2);
    if(count==0)    
        printf("No solution!\n");
    else  
        printf("count=%d",count);
}


void find(int x,int y,int dep)
{  
    int i,xx,yy;
    for(i=0;i<8;i++)     //加上方向增量,形成新的坐标 
    { 
        xx=x+fx[i];    
        yy=y+fy[i];       
        if(check(xx,yy)==1)  //判断新坐标是否出界,是否已走
        {  
            a[xx][yy]=dep;      //走向新的坐标
            if(dep==n*m) 
                output();
            else 
                find(xx,yy,dep+1);//从新坐标出发,递归下一层
            a[xx][yy]=0;  
        }
    }
    //回溯,恢复未走标志
}


void output()
{   
    count++;
    printf("\ncount=%d",count);
    for(y=0;y<n;y++) 
    {  
        printf("\n");
        for(x=0;x<m;x++) 
            printf("%3d ",a[y][x]);
    }
    printf("\n");
}

int check(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]==0)
        return 1;
    else
        return 0;
}
    原文作者:回溯法
    原文地址: https://blog.csdn.net/johnWcheung/article/details/72829062
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞