刚看数据结构(严蔚敏),很多东西不会。。
这次。。看着伪代码。。好不容易。。写出来了。。源代码。。
恩恩。。我好样的。。
保留在这算是个纪念吧。。。
//mainstruct.c(主函数)
#include "my.h"
#define N 10
int map[N][N]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int main()
{
int i,j;
SqStack s;
PosType curpos,start={1,1},end={8,8};
ElemType e;
InitStack(&s); curpos = start;
int curstep = 1;
do
{
if( Pass(map,curpos) ) //当前位置可以通过,即是未曾走到过的通道块
{
FootPrint(map,curpos);
//给e赋值
e.ord = curstep;
e.seat = curpos;
e.di = 1;
Push(&s,e);
if(curpos.x == end.x && curpos.y == end.y) break;;
curpos = NextPos( curpos, 1 );
curstep++;
}//if
else //当前位置不能通过
{
if( ! EmptyStack(&s) )
{
Pop(&s, &e);
while(e.di == 4 && !EmptyStack(&s))
{
FootPrint(map,e.seat);
Pop(&s,&e);
}
if(e.di < 4)
{
e.di++; Push(&s,e);
curpos = NextPos(e.seat, e.di);
}
}
}
}while( !EmptyStack(&s) );
//将路径输出
ElemType *ps;
ps = s.base;
while(ps != s.top ) //将求解的路径的值设置为2
{
map[ps->seat.x][ps->seat.y] = 2;
ps++;
}
//显示
for(i=0; i<N; i++) //2为走的路径
{
for(j=0; j<N; j++)
printf("%d ",map[i][j]);
putchar('\n');
}
return 0;
}
//my.h
#ifndef MY_H
#define MY_H
//head file
#include <stdio.h>
#include <stdlib.h>
//definition
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct
{
int x;
int y;
}PosType;
typedef struct
{
int ord; //通道块在路径上的‘序号’
PosType seat; //通道块在迷宫中的“坐标位置”
int di; //栈的元素类型
}SElemType;
//type
typedef SElemType ElemType;
typedef int Status;
//struct
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S);
Status GetTop(SqStack *S,ElemType *e);
Status Push(SqStack *S, ElemType e);
Status Pop(SqStack *S, ElemType *e);
Status EmptyStack(SqStack *S);
//function
Status FootPrint(int pmap[][10],PosType pos); //留下足迹
Status Pass(int pmap[][10],PosType e); //当前位置是否可以通过
PosType NextPos(PosType e,int n); //下一方向
Status ClearFoot(int pmap[][10], PosType pos); //清除走过的痕迹
#endif //MY_H
//my.c
#include "my.h" Status InitStack(SqStack * S) { S->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !S->base ) return ERROR; S->stacksize = STACK_INIT_SIZE; S->top = S->base; return OK; } Status GetTop(SqStack * S, ElemType *e) { if( S->top == S->base ) return ERROR; *e = *(S->top-1); return OK; } Status Push(SqStack *S, ElemType e) { if( S->top - S->base >= S->stacksize ) //没有问题? { S->base = (ElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(ElemType)); if( !S->base ) return ERROR; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return OK; } Status Pop(SqStack *S, ElemType *e) { if( S->base == S->top ) return ERROR; *e = *--S->top; return OK; } Status EmptyStack(SqStack *S) { if( S->base == S->top ) return OK; else return ERROR; } Status FootPrint(int pmap[][10],PosType pos) { pmap[pos.x][pos.y] = 1; return OK; } Status Pass(int pmap[][10],PosType e) { if(pmap[e.x][e.y] == 1 || pmap[e.x][e.y] == 2) return FALSE; else return TRUE; } PosType NextPos(PosType e,int n) { switch(n) { case 1: //right e.y++; break; case 2: //down e.x++; break; case 3: //left e.y--; break; case 4: //up e.x--; break; } return e; }最后输出时。。会将找到的路径的值设置为2.。。便形成了一条通路