#include<stdio.h>
#include<stdlib.h>
#define maxinit 1000
#define fenpei 1000
#define true 1
#define false 0
#define ok 1
#define error 0
int ditu[10][10]={
{1,1,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0},
{0,0,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,1}
};
int leftstep=1;
typedef int Status;
typedef struct{
int x;
int y;
}zuobiao;
typedef struct{
int lj;
zuobiao e;
int fx;
}bloockpostion;
typedef struct{
bloockpostion *top;
bloockpostion *data;
int nowsize;
}sqstack;
//留下足迹
void printi(int a,int b){
int i;
int j;
for(i=0;i<a;i++){
for(j=0;j<b;j++){
printf("%d ",ditu[i][j]);
if(j==9){
printf("\n");
}
}
}
}
Status stackempty(sqstack s){
if(s.top==s.data)
return true;
else
return false;
}
void printitlast(zuobiao x){
//现在的数,迪迦
ditu[x.x][x.y]=leftstep;
}
//输入坐标以后传到这里判断
Status pass(zuobiao j)
{
if(ditu[j.x][j.y]==1)
return ok;
else
return error;
}
zuobiao nextstep(zuobiao h,int fx){
zuobiao ggg[4]={{0,1},{1,0},{0,-1},{-1,0}};
h.x+=ggg[fx].x;
h.y+=ggg[fx].y;
return h;
}
//标记不能走的为-1
void markcant(zuobiao x)
{
ditu[x.x][x.y]=-1;
}
Status initstack(sqstack *s)
{
s->data=(bloockpostion *)malloc(sizeof(bloockpostion)*maxinit);
if(!s->data)
exit(-1);
s->top=s->data;
s->nowsize=maxinit;
printf("初始化成功,大小为:%d\n",s->nowsize);
return ok;
}
Status push(sqstack *s,bloockpostion e)
{
if(s->top-s->data>=s->nowsize)
{
s->data=(bloockpostion *)realloc(s->data,sizeof(bloockpostion)*(s->nowsize+maxinit));
if(!s->data){
printf("重新失败");
exit(-1);
}
s->top=s->data+s->nowsize;
s->nowsize+=maxinit;
printf("重新分配成功");
}
*(s->top++)=e;
// printf("%d,%d,%d,%d",e.e.x, e.e.y, e.fx,e.lj);
return ok;
}
Status pop(sqstack *s){
if(s->top==s->data)
printf("出栈失败");
return error;
s->top--;
return ok;
}
Status havepath(zuobiao begin,zuobiao final){
sqstack s;
//现在走到哪了
zuobiao nowzuobiao;
bloockpostion l;
initstack(&s);
nowzuobiao=begin;
//开始找了
do{
//是否可通当前坐标
if(pass(nowzuobiao)){
//留下足迹
printitlast(nowzuobiao);
l.e.x=nowzuobiao.x;
l.e.y=nowzuobiao.y;
l.lj=leftstep;
l.fx=0;
push(&s,l);
leftstep++;
if(nowzuobiao.x==final.x&&nowzuobiao.y==final.y)
return true;
nowzuobiao=nextstep(l.e,l.fx);
}
else{
if(!stackempty(s))
{
pop(&s);
leftstep--;
while(l.fx==3&&!stackempty(s)) {
markcant(l.e);
pop(&s);
leftstep--;
}
if(l.fx<3){
l.fx++;
push(&s,l);
leftstep++;
nowzuobiao=nextstep(l.e,l.fx);
}
}
}
}while(!stackempty(s));
return false;
}
int main(){
// 起点终点坐标结构
zuobiao begin;
zuobiao final;
// sqstack s;
//
// initstack(&s);
//
//bloockpostion b;
// b.e.x=3;
// b.e.y=4;
// b.fx=0;
// b.lj=1;
//
//
//push(&s,b);
//push(&s,b);
//pop(&s);
//
//
printf("请输入起点");
scanf("%d,%d",&begin.x,&begin.y);
printf("请输入终点");
scanf("%d,%d",&final.x,&final.y);
//判断是否有路线
if(havepath(begin,final))
{
printf("有路线如下\n");
//打印出来
printi(10,10);
}
else{
printf("找不到");
}
return 0;
}