#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef struct Postion
{
int row;
int col;
}PT;
///////////////////////////////////////////////////////////////////////
typedef PT STDataType;
typedef struct StackNode
{
STDataType* a;
int capacity;
int top;
}SN;
//初始化
void Stackinit(SN* pq)
{
assert(pq);
pq->a = (STDataType*)malloc(sizeof(STDataType) * 4);
if (pq->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
else
{
pq->capacity = 4;
pq->top = 0;
}
}
//清空
void StackDestroy(SN* pq)
{
assert(pq);
free(pq->a);
pq->a = NULL;
pq->top = pq->capacity = 0;
}
//入栈
void StackPush(SN* pq, STDataType x)
{
assert(pq);
if (pq->top == pq->capacity)
{
STDataType*tmp = (STDataType*)realloc(pq->a, sizeof(STDataType) * 2 * pq->capacity);
if (pq->a == NULL)
{
printf("realloc fail\n");
exit(-1);
}
else
{
pq->capacity *= 2;
pq->a = tmp;
}
}
pq->a[pq->top] = x;
pq->top++;
}
//出栈
void StackPop(SN* pq)
{
assert(pq);
assert(pq->top > 0);
pq->top--;
}
//打印栈顶
STDataType Stacktop(SN* pq)
{
assert(pq);
assert(pq->top > 0);
return pq->a[pq->top - 1];
}
//元素个数
int Stacksize(SN* pq)
{
assert(pq);
return pq->top;
}
//判断是否为空
int StackEmpty(SN* pq)
{
assert(pq);
if (pq->top == 0)
{
return 1;
}
else
{
return 0;
}
}
//栈的全局变量
SN path;
SN minpath;
///////////////////////////////////////////////////////////////////////
//打印
void PrintMaze(SN* minpath)
{
SN ps;
Stackinit(&ps);
while(!StackEmpty(minpath))
{
StackPush(&ps,Stacktop(minpath));
StackPop(minpath);
}
while(Stacksize(&ps)>1)//打印路径,最后一个不要 逗号,
{
PT top=Stacktop(&ps);
printf("[%d,%d],",top.row,top.col);
StackPop(&ps);
}
//打印路径的最后一个
PT top=Stacktop(&ps);
printf("[%d,%d]",top.row,top.col);
StackPop(&ps);
StackDestroy(&ps);
}
//判断是否越界或者是墙壁或者走过的路
int IsPass(int** maze,int M,int N,PT pos)
{
if(pos.row>=0 && pos.row<M
&& pos.col>=0 && pos.col<N
&& maze[pos.row][pos.col]==1)
{
return 1;
}
else
{
return 0;
}
}
//将path中的数据拷贝到minpath
void StackCopy(SN* ppath,SN* pcopy)
{
pcopy->a=(STDataType*)malloc(sizeof(STDataType*)* ppath->capacity);
if(pcopy->a==NULL)
{
printf("pcopy->a malloc fail\n");
}
else
{
memcpy(pcopy->a,ppath->a,sizeof(STDataType)* ppath->top);
pcopy->top=ppath->top;
pcopy->capacity=ppath->capacity;
}
}
//栈的全局变量的初始化
void GetMazePath(int** maze,int M,int N,PT cur,int P)
{
StackPush(&path,cur); //把坐标记录进栈
//出口
if(cur.row==0 && cur.col==N-1)
{
if(P>=0 && StackEmpty(&minpath)
|| Stacksize(&path)<Stacksize(&minpath))
{
StackDestroy(&minpath); //清除minpath的空间
StackCopy(&path,&minpath); //将path中的数据拷贝到minpath
}
}
PT next;
maze[cur.row][cur.col]=2; //走过的路标记为2
//上
next=cur;
next.row -=1;
if(IsPass(maze,M,N,next)) //判断是否越界或者是墙壁
{
GetMazePath(maze,M,N,next,P-3);
}
//下
next=cur;
next.row +=1;
if(IsPass(maze,M,N,next)) //判断是否越界或者是墙壁
{
GetMazePath(maze,M,N,next,P);
}
//左
next=cur;
next.col -=1;
if(IsPass(maze,M,N,next)) //判断是否越界或者是墙壁
{
GetMazePath(maze,M,N,next,P-1);
}
//右
next=cur;
next.col +=1;
if(IsPass(maze,M,N,next)) //判断是否越界或者是墙壁
{
GetMazePath(maze,M,N,next,P-1);
}
maze[cur.row][cur.col]=1; //走回去后把走过的路重新记为1
StackPop(&path); //走错了返回后要删除
}
int main()
{
int M, N, P;
while (scanf("%d %d %d", &M, &N, &P) != EOF)
{
//创建二维数组
int** maze=(int**)malloc(sizeof(int*)*M);
for(int i=0;i<M;i++)
{
maze[i]=(int*)malloc(sizeof(int)*N);
}
//二维数组的输入
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
scanf("%d ",&maze[i][j]);
}
}
//入口点
PT entry={0,0};
//栈的全局变量的初始化
Stackinit(&path);
Stackinit(&minpath);
//寻找最短路径
GetMazePath(maze,M,N,entry,P);
if(!StackEmpty(&minpath))
{
PrintMaze(&minpath); //打印
}
else
{
printf("Can not escape!");
}
//栈的全局变量的清除
StackDestroy(&path);
StackDestroy(&minpath);
//清除空间
for(int i=0;i<M;i++)
{
free(maze[i]);
}
free(maze);
maze=NULL;
}
return 0;
}