刚学都这样,想当初我学习的时候连一个单链表的逆置,都要理解半天。编程就是把实际问题给抽象成数学或非数学模型,结合数据的表示,再找到解决的方法。别忘了,学习数据结构是为了更好的操作数据。
思路:
首先,迷宫如何用计算机语言表示?一般用二维数组。0表示墙,1表示路。
其次,其次就是如何从迷宫中走出来了。结合堆栈,进行搜索。
你可以尝试着对问题进行分层,然后逐步细化来解决。
如果你要解决一个别人给的走迷宫的问题,同样还是要这样,首先把别人给的迷宫在计算机中表示出来,其次结合数据结构所学的知识,找到通路,(关于结合数据结构的知识就看你自己的了,关键是对堆栈的了解)。
关于你说的,先看别人的程序,找到思路后自己才能编程问题。我看你是操之过急了,你得明白,知识的学习,首先就是会模仿,等你对整个课程有了系统的认识,你才会有自己的解题思路。创新是在有基础的前提下进行的。别人的东西,试着理解,毕竟许多东西单凭我们自己是不太可能想出来的,就像kmp算法一样(你应该马上就会学到)。
第一章说过,研究数据间的关系的目的是为了更好的操作数据,迷宫问题,可以说是一类“搜索”问题,更强调的是算法,即在精通堆栈的基础上想出一个利用堆栈对迷宫进行搜索的办法。而堆栈,则是基础,堆栈的操作就那么几个,学完马上就会用。关键是如何运用三种程序设计方法再结合某些数据结构设计出一个算法。一步一步来吧。
对了,给你一个问题考虑考虑,“不用任何辅助变量”编写一个程序,逆置一个字符串试试。只给你一个参数:该参数就是指向字符串的指针。
你的最后问题问的就有点没头绪了,学习的过程并不是你想的那样的,不见得数据结构学完之后就能编写高质量程序,写程序和看程序是相辅相成的,写而不学则怠,学而不写则罔。可以尝试的写写,自己找不到思路可以看看别人是怎么想的,自己多做做总结。
海龟作图行不。这是我大一时的C语言课程设计,我自已做的。
高级级语言课程设计实验报告
实验课程:课程设计年级:2004级实验成绩:
课程设计名称海龟作图姓名:
任课教师:学号:2004810025实验日期:
一、目的
通过编一些小程序,巩固和利用所学的知识,加强变成能力。
本课题涉及的知识内容:for循环嵌套,if语句,二维数组,文件创建与保存,自定义函数等高级语言内容。
二、内容与设计思想
1.设计内容
海龟爬行过程中,笔朝下纪录海龟爬行踪迹,笔朝上则不纪录并保存踪迹,
1表示笔朝上,2表示朝下,3右转弯,4左转弯,5,x向前走x格,6打印
9结束
2.主要代码结构
main()函数调用了两个函数
3.主要代码段分析。
譬如print函数,打印海龟踪迹并保存。Step函数当笔朝上时海龟走过的数组值加一
三、使用环境
本次上机实践所使用的平台和相关软件。
平台:Windows 2000
相关软件:VC++
四、调试过程
1.测试结果分析
经检验,运行结果正确
五、总结
1.设计中遇到的问题及解决过程
调试过程中出现一些逻辑和语法错误,但是语法错误容易纠正,而
逻辑错误则比较难纠正。有时会漏掉“,”,“;”,“}”等符号
2.设计体会和收获。
发现自己也能解决有点复杂的问题
六、附录
1.源代码
/*海龟作图,活动区域50*50,超出区域,海龟死亡游戏完*/
#include
void print(int [][49]);
void move(int [][49],int,int,int);
main()
{
int step[49][49];
int a,gostep,direct=1,record=1,i,j;
for(i=0;i<=49;i++)
for(j=0;j<=49;j++)
step[i][j]=0;
while(1)
{
scanf("%d,%d",&a,&gostep);
if(a==2) record=1;
if(a==1) record=0;
if(a==4)
{
direct++;
if(direct==5) direct=1;
continue;
}
if(a==3)
{
direct--;
if(direct==0) direct=4;
continue;
}
if(a==5)
{
move(step,gostep,direct,record);
continue;
}
if(a==6)
print(step);
if(a==9)
return 0;
}
}
/*打印海龟踪迹并保存*/
void print(int s[][49])
{
int i,j;
FILE*fp;
fp=fopen("D:\\step.txt","w");
for(i=0;i<=49;i++)
{
for(j=0;j<=49;j++)
{
printf(s[i][j]==0?"":"*");
fprintf(fp,s[i][j]==0?"":"*");
}
printf("\n");
}
fclose(fp);
}
void move(int t[][49],int i,int j,int k)
{
static int x=0,y=0;
int xmove,ymove,num;
if(j==1)
{
xmove=1;ymove=0;}
if(j==2)
{
xmove=0;ymove=-1;
}
if(j==3)
{
xmove=-1;ymove=0;
}
if(j==4)
{
xmove=0;ymove=1;
}
for(num=0;num
{
t[0][0]=1;
x+=xmove;
y+=ymove;
if(x<0||x>49||y<0||y>49)
{
printf("the place is danger,you are died");
exit();
}
t[y][x]+=k;
}
}
可以给你点提示:迷宫可用个二维数组表示。求解方法是:从入口出发,顺某个方向走,若能过去,继续;否则,沿着原路返回,换方向继续走,直到所有可能的通路都被找到为止。为保证在任何位置上都能沿原路退回,需要一个先进后出的栈结构保存从入口到当前位置的路径。这里,给个算法的思想,不实现图形界面了。假设迷宫数据存放在一txt中:
迷宫数据
8 8//迷宫的大小,行数与列数
1 1 8 8//1 1表入口位置 8 8表出口位置
0 0 1 0 0 0 1 0//以下表迷宫,1表示墙、0表示通路,为避免走的过程中越界,最好在四周加上以堵墙。
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 1 0 0 0 0 0 0
#include
#include
#define MAXSIZE 50
#define ERROR-1
#define OK 0
#define FALSE 0
#define TRUE 1
typedef enum{RIGHT,DOWN,LEFT,UP} Direction;
typedef enum{YES,NO} MarkTag;
typedef struct position{//迷宫中位置的坐标
int x;
int y;
}Position;
typedef struct{//当前位置在路径中的序号
int order;//当前位置在迷宫中的坐标
Position seat;//从当前位置走到下一位置的方向
Direction di;//栈元素的类型
}SElemType;
typedef struct{
SElemType*elem;
int top;
}Stack;
char maze[MAXSIZE+2][MAXSIZE+2];//用二维数组表示迷宫
int InitStack(Stack*S){//创建一个空栈
S->elem=(SElemType*)malloc(MAXSIZE*MAXSIZE*sizeof(SElemType));
if(!S->elem)
return ERROR;
S->top=0;
return OK;
}
int Push(Stack*S,SElemType e){//元素e入栈
if(S->top>=MAXSIZE*MAXSIZE)
return ERROR;
S->elem[S->top++]=e;
return OK;
}
int Pop(Stack*S,SElemType e){//栈顶元素出栈,由e带回栈顶元素
if(S->top<=0)
return ERROR;
*e=S->elem[--S->top];
return OK;
}
int Empty(Stack S){//若栈为空,返回TRUE,否则返回FALSE
if(S.top==0)
return TRUE;
return FALSE;
}
int createMaze(char*filename,Position*startpos,Position*endpos){//从文件filename读入数据创建迷宫,由参数带回入口位置和出口位置
FILE*fp;
int i,j,rows,cols,temp;
Position start,end;
fp=fopen(filename,"r");
if(!fp){
printf("open file%s error!\n",filename);
return ERROR;
}
if(!feof(fp)){
fscanf(fp,"%d%d",&rows,&cols);//读入迷宫的行数和列数
fscanf(fp,"%d%d",&start.x,&start.y);//读入迷宫的入口位置
fscanf(fp,"%d%d",&end.x,&end.y);//读入迷宫的出口位置
}
for(i=1;i<=rows;i++)//读入迷宫数据
for(j=1;j<=cols;j++){
fscanf(fp,"%d",&temp);
maze[i][j]=48+temp;
}
fclose(fp);
//在迷宫四周加墙
for(i=0,j=0;i<=rows+1;i++) maze[i][j]='1';
for(i=0,j=cols+1;i<=rows+1;i++) maze[i][j]='1';
for(i=0,j=0;j<=cols+1;j++) maze[i][j]='1';
for(i=rows+1,j=0;j<=cols+1;j++) maze[i][j]='1';
*startpos=start;
*endpos=end;
return OK;
}
int canPass(Position curpos){
if(maze[curpos.x][curpos.y]=='0')
return TRUE;
return FALSE;
}
void markPos(Position curpos,MarkTag tag){//为已走过的位置标记
switch(tag){
case YES: maze[curpos.x][curpos.y]='.'; break;//路径标记
case NO: maze[curpos.x][curpos.y]='#'; break;//死胡同标记
}
}
Position nextPos(Position curpos,Direction dir){//根据当前的位置坐标和下一步要探索的方向dir求下一步要走的位置坐标
Position nextpos;
switch(dir){
case RIGHT: nextpos.x=curpos.x; nextpos.y=curpos.y+1; break;
case DOWN: nextpos.x=curpos.x+1; nextpos.y=curpos.y; break;
case LEFT: nextpos.x=curpos.x; nextpos.y=curpos.y-1; break;
case UP: nextpos.x=curpos.x-1; nextpos.y=curpos.y; break;
}
return nextpos;
}
Direction nextDir(Direction dir){
switch(dir){//按照RIGHT DOWN LEFT UP的次序进行路径探索
case RIGHT: return DOWN;
case DOWN: return LEFT;
case LEFT: return UP;
}
}
/*若迷宫中存在从入口start到出口end的通道,则求得一条存放在栈S中,并返回TRUE,若不存在则返回FALSE*/
int Solve(Stack*S,Position start,Position end){
Position curpos;
SElemType e;
int curstep=1;
if(InitStack(S)==ERROR)
return FALSE;
curpos=start;
do{
if(canPass(curpos)){//当前位置可以通过
markPos(curpos,YES);//留下足迹
e.order=curstep;
e.seat=curpos;
e.di=RIGHT;
Push(S,e);
if(curpos.x==end.x&& curpos.y=end.y)
return TRUE;//找到从入口到出口的通道
curpos=nextPos(curpos,RIGHT);
curstep++;
}
else{
if(!Empty(*S)){//当前位置不能通过
if(Pos(S,&e)==ERROR)
return FALSE;
while(e.di==UP&&!Empty(*S)){//4个方向都找不到通路,则回溯
curpos=e.seat;
markPos(curpos,NO);
if(Pop(S,&e)==ERROR)
return FALSE;
}
if(e.di!=UP){//4个方向还没有探索完
e.di=nextDir(e.di);
Push(S,e);//换下一个方向探索
curpos=nextPos(e.seat,e.di);
}
}
}while(!Empty(*S));
return FALSE;
}
void main(void){
Position startPos,endPos;
Stack path;
SElemType e;
char*fname="in.txt";
if(createMaze(fname,&startPos,&endPos)==ERROR) return;
Solve(&path,startPos,endPos);
while(!Empty(path)){//输出出口到入口的路径
Pop(&path,&e);
printf("(%d,%d)\n",e.seat.x,e.seat.y);
}
}
下一篇:c语言抢30游戏的知识点