一个用于练习链表的“跳马”程序

# include <stdio.h>
/****************************************
*程序名称: 跳  马                      *
*程序作者: flyli(ProgramFan)           *
*程序版本: 1.00                        * 
*完成时间:2006.6.1                     *
*修改时间:                             *
*程序说明:此程序所完成的事情是算出中国 *
*          象棋中的“马”从一个位置调到 *
*          另一个位置的所有算法,要求马 *
*          只能向右走不能向左走.        *
****************************************/
unsigned XNum = 10;
unsigned YNum = 10;
unsigned Jadge,MidSate = 0,ALL=0,x,y;      //
struct Information *PHead,*P1,*P2,*P3;
void New(int X,int Y,int Sate);
void Del_Free(void);
char SetStart(int X,int Y,int Sate);
struct Information   //一个结构体,拥有X,Y坐标信息,一个链节信息和2个指针
{
    int X;
    int Y;
    int Sate;
    struct Information * next;
    struct Information * back;
};

int main(void)
{
    PHead = P1 = P2 = (struct Information *)malloc(sizeof(struct Information));
    //建立一个空的结构(主要用于判断程序的结束条件)
    P2 = (struct Information *)malloc(sizeof(struct Information));
    P2->X = 0;
    P2->Y = 0;
    P2->next = 0;
    P2->back = P1;
    P1->next = P2;
    P1 = P2;
    P2->Sate = 1;
    while(SetStart(P2->X,P2->Y,MidSate))
    {;}
    while(P2 != PHead)
    {
        while(SetStart(P2->X,P2->Y,MidSate))
        {
            MidSate=1;
        }  
        Del_Free();
        while(MidSate == 5)
        {
            Del_Free();
        }         
    }
    printf("%d",ALL);
   
    system("pause");
    return 0;   
}

/***********************************
*函数说明:建立一个新的链          *
*函数输入:新的链中的字符位置      *
***********************************/
void New(int X,int Y,int Sate)
{
   P2 = (struct Information *)malloc(sizeof(struct Information)); //开辟个内存空间            
   P1->next = P2;                    //将上个指针连到此结构体
   P2->back = P1;                    //将这个空间的回指针指向上个指针
   P1 = P2;                          //把p1,p2都指到新的空间
   P2->X = X;                        //对新空间进行赋值
   P2->Y = Y;
   P2->Sate = Sate;                   
   P2->next = 0;                      //将next指针赋值为0
}

/***********************************
*函数说明:释放一个链 (最后的那个) *
*函数输入:新的链中的字符位置      *
***********************************/
void Del_Free(void)
{
   
    MidSate = P2->Sate+1;
    P2 = P2->back;            //将p2指回上一结构体
    P1 = P2;                  //将P1也指回
    free(P2->next);           //把后面的那个结构体的内存空间释放掉
    P2->next = 0;             //对next指针进行赋0 
}

/***********************************
*函数说明: 用于探索下一位置的函数 *
*函数输入: 要探索的起始位置       *
***********************************/
char SetStart(int X,int Y,int Sate)
{
    if (Sate ==1)
        goto X1;
    else if (Sate ==2)
        goto X2;
    else if (Sate ==3)
        goto X3;
    else if (Sate ==4)
        goto X4;
        x=X;y=Y;
X1: if(X+1<XNum && Y+2<YNum)              //当马跳后不会超出棋盘时
    {
        New(X+1,Y+2,1);                      //继续跳
        return 1;                          //判断变量为真
    }
X2: if(X+1<XNum && Y-2>=0)
    {
        New(X+1,Y-2,2); 
        return 1;        
    }
X3: if(X+2<XNum && Y+1<YNum)
    {
        New(X+2,Y+1,3);
        return 1;
    } 
X4: if(X+2<XNum && Y-1>=0)
    {
        New(X+2,Y-1,4);
        return 1;
    }  
    x = P2->X;y = P2->Y;
    if(x == XNum-1 && y == YNum-1 )  //
    {
        P3 = PHead->next;
        while(P3->next != 0)
        {
            printf("%d,%d/n",P3->X,P3->Y);
            P3 = P3->next;                   
        }
        printf("%d,%d/n/n",XNum-1,YNum-1);
        ALL++;
                
    }
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
运 用 贪 心 算 法 ,vc++ 语 言 编 写 , 可 单 步 输 出 结 果 【问题描述】 跳马问题也称骑士遍历、马踏棋盘问题:在8*8方格的棋盘上,从任意指定的方格出发,为象棋中的马寻找一条走遍棋盘每一格并且只经过一次的一条路径。 考虑国际象棋棋盘上某个位置的一只马,它是否可能只走63步,正好走过除起点外的其他63个位置各一次?如果有一种这样的走法,则称所走的这条路线为一条马的周游路线。试设计一个算法找出这样一条马的周游路线。 在一个8×8的方格棋盘中,按照国际象棋中马的行走规则从棋盘上的某一方格出发,开始在棋盘上周游,如果能不重复地走遍棋盘上的每一个方格, 这样的一条周游路线在数学上被称为国际象棋盘上马的哈密尔顿链。请你设计一个程序,从键盘输入一个起始方格的坐标,由计算机自动寻找并打印 【算法描述】 本题有较多方法求解,在此仅对回溯法进行分析。 一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2)。从中任选择一个方向前进,到达新的位置。在从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,就再回退到上一位置……

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值