1. 程式人生 > >DPS演算法 馬走日字 視覺化

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的應用很感興趣,還要繼續加強學習!