DPS算法 马走日字 可视化

#include <stdio.h>
#include <stdlib.h>
#define N 4
static int count;

void print_line()                             //分割线
{
    printf("\n\n-------------------------------------------------------\n\n");
}

int judge(int *a,int x1,int x2,int y2,int m)
{
    if(x1>x2-1||(x1==x2-1&&a[x1]!=y2)||a[x1]<1||a[x1]>m)
        return 0;
    return 1;
}

void print_map(int *a,int m,int n,int x2)               //打印棋盘
{
    int i,j,k;

    count++;
    print_line();
    printf("路线%d:\n\n",count);

    for(i=m;i>=1;i--)
    {
        if(i==m)
        {
            for(k=1;k<=n;k++)
                    printf(k+1>=10?"%-3d":"%-4d",k);
            puts("");
        }
        for(j=0;j<n;j++)
        {
            if(j==0)
                printf(a[j]!=i||j>x2-1?"+":"O");
            else
                if(j==n-1)
                    printf(a[j]!=i||j>x2-1?"---+":"---O");
            else
                printf(a[j]!=i||j>x2-1?"---+":"---O");
        }
        if(i>=2)
        {
             puts("");
            for(k=0;k<n-1;k++)
                printf("|   ");
            printf("|\n");
        }
    }
}

void think(int *a,int x1,int x2,int y2,int m,int n)
{
    int i;
    if(a[x1]==y2&&x1==x2-1)            //状态搜索树遍历到叶子结点打印棋盘
        print_map(a,m,n,x2);
    else
    {
        for(i=0;i<N;i++)
        {
            switch(i)                     //马要走的方向
            {
                case 0:x1++;a[x1]=a[x1-1]+2;break;
                case 1:x1+=2;a[x1]=a[x1-2]+1;break;
                case 2:x1+=2;a[x1]=a[x1-2]-1;break;
                case 3:x1++;a[x1]=a[x1-1]-2;break;
            }
            if(judge(a,x1,x2,y2,m))
                think(a,x1,x2,y2,m,n);
            switch(i)                          //返回,继续遍历
            {
                case 0:a[x1]=a[x1-1]-2;x1--;break;
                case 1:a[x1]=a[x1-2]-1;x1-=2;break;
                case 2:a[x1]=a[x1-2]+1;x1-=2;break;
                case 3:a[x1]=a[x1-1]+2;x1--;break;
            }

        }
    }
}

int main()
{
    int x1,y1,x2,y2,m,n;
    int i,*a;
    char key;

    do
    {
        count=0;
        print_line();
        printf("请输入n,m:");
        scanf("%d%d",&n,&m);
        print_line();
        printf("请输入起点坐标:");
        scanf("%d%d",&x1,&y1);
        print_line();
        printf("请输入终点坐标:");
        scanf("%d%d",&x2,&y2);
        a=(int*)malloc(n*sizeof(int));
        for(i=0;i<n;i++)
            a[i]=0;
        a[x1-1]=y1;
        think(a,x1-1,x2,y2,m,n);
        print_line();
        printf("共有%d条路线!",count);
        print_line();
        printf("是否继续计算:[ ]\b\b");
        fflush(stdin);
        scanf("%c",&key);
    }while(key=='Y'||key=='y');

    return 0;
}

最近对状态搜索树,dfs的应用很感兴趣,还要继续加强学习!

猜你喜欢

转载自blog.csdn.net/weixin_40552964/article/details/82632852