一个用于练习链表的“跳马”程序
2006-06-26 10:30
162 查看
# 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;
}
/****************************************
*程序名称: 跳 马 *
*程序作者: 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;
}
相关文章推荐
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 一个C#程序,用到了双向链表
- 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现
- 编写一个程序,用于水果店售货员结账。已知苹果每斤2.50元,鸭梨每斤1.80元,香蕉每斤2元,橘子每斤1.60元。要求输入各种水果的重量,打印应付金额。再输入顾客付款数,打印应找零的金额。
- C#实现一个用于开机启动其他程序的Windows服务
- 用链表实现的一个小程序(C语言)
- Java实训——编写一个窗体程序,用于计算一元二次方程。
- 一个用于专利下载的Delphi源代码程序
- 编写一个简单的程序,用于校对选择题答案
- 练习1-18 编写一个程序,删除每个输入行末尾的空格以及制表符,并删除完全是空格的行
- 第八章编程练习第一题:设计一个程序,统计从输入到文件结尾为止的字符数
- C primer plus 第七章 练习4: 利用if else语句编写程序读取输入,直到#, 用一个感叹号代替每个句号,将原有的每个感叹号用两个感叹号代替,最后报告进行了多少次替代。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 一个用于统计输入中各个C语言关键字出现次数的程序
- 练习1-17 编写一个程序,打印长度大于80个字符的所有输入行.
- (1)写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”); (2)编写单元测试进行测试; (3)用ElcEmma查看代码覆盖率,要求覆盖率达到100%。
- 编写一个程序,用于接收用户输入的数,然后显示从0到该数为止表示的所有字符,询问用户是否愿意再次继续同样的过程
- 编写一个程序,实现删除链表中倒数第k个节点(用单链表实现)
- 设计一个程序,用于赛车上的计算机监视系统
- izpack是一个用于解决安装程序制作的Builder工具