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

原创 2006年06月26日 10:30:00

# 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;
}

C++——跳马问题(广搜)

跳马时限:1000ms 内存限制:10000K 总时限:3000ms描述:在国际象棋中,马的走法与中车象棋类似,即俗话说的“马走日”,下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能...
  • chengchencheng
  • chengchencheng
  • 2017年11月16日 14:28
  • 101

【练习题】编写打印出一个单链表的所有元素的程序【链表】

只是实现了链表ADT的部分功能。 /*---编写打印出一个单链表的所有元素的程序---*/ #include #include struct Node{ int val; struct N...
  • u012846486
  • u012846486
  • 2014年05月22日 22:39
  • 3537

跳马问题。bfs计数

描述          在中国象棋中,棋子活动的场所,叫做"棋盘",在长方形的平面上,绘有九条平行的竖线和十条平行横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五、第六两横线之...
  • nucshiyilang
  • nucshiyilang
  • 2016年04月16日 21:27
  • 456

c# 程序设计及应用教程上机A.2.1————密码输入和显示练习

编写一个windows窗口应用程序,界面中有一个Label,2个Text Box,1个CheckBox和一个Panel。第一个文本框用于让用户输入密码,第二个文本框用来显示密码;复选框用于让用户选择是...
  • Mr_JinChang
  • Mr_JinChang
  • 2017年03月21日 21:01
  • 637

BFS 中国象棋中的跳马问题 (棋盘障碍)

题目描述 现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同) 输入 第一行输入n表示有n组测试数据。 每组测试数据第一行输入2个整数p...
  • deepseazbw
  • deepseazbw
  • 2017年07月17日 23:20
  • 358

回朔法和递归解决八皇后和跳马问题

八皇后问题、如果在8×8的象棋棋盘上,放上8个皇后,使得每个皇后不在同一行,同一列,同一斜线上,试输出所有可能的摆放方法。   显而易见的,用深搜回溯法解决,每一列只能放下一枚皇后棋子,那么用一个一维...
  • ysayk
  • ysayk
  • 2016年02月26日 22:56
  • 1836

C++ - Nuc - 00004:跳马问题(bfs)

在中国象棋中,棋子活动的场所,叫做"棋盘",在长方形的平面上,绘有九条平行的竖线和十条平行横线相交组成,共九十个交叉点,棋子就摆在这些交叉点上。中间第五、第六两横线之间未画竖线的空白地带,称为"河界"...
  • qq_34594236
  • qq_34594236
  • 2016年06月26日 19:48
  • 1037

用回溯法求解跳马问题

 算法描述       一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2),从中...
  • a381989813
  • a381989813
  • 2007年07月03日 18:58
  • 1487

课程设计——中国象棋中的跳马问题

中国象棋中的跳马问题 题目描述 现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同) 输入 第一行输入n表示有n...
  • lishuhuakai
  • lishuhuakai
  • 2012年10月13日 23:58
  • 2723

写的很好 链表的各种题目整理(C语言实现)

这里处理的全部是单链表: typedef struct node { char *data; struct node *next; } node_t; 我们约定一个打...
  • hongkangwl
  • hongkangwl
  • 2014年04月03日 21:25
  • 4807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个用于练习链表的“跳马”程序
举报原因:
原因补充:

(最多只允许输入30个字)