#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
#include<math.h>
#include<ctype.h>
#include<assert.h>
#include<stdbool.h>
#include<errno.h>
#include<malloc.h>
#include<stddef.h>
typedef struct Position
{
int row;
int col;
}PT;
typedef PT STDataType;
typedef struct stack
{
STDataType* a;
int top;
int capacity;
}ST;
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int SizeStack(ST* ps);
bool StackEmpty(ST* ps);
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;//这是指向栈顶数据的下一个
//ps->top=-1 这是指向栈定数据
}
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)
{
int newCapacity=ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = realloc(ps->a, sizeof(STDataType) * newCapacity);
if (tmp == NULL)
{
printf("realloc fail");
exit(-1);
}
ps->a = tmp;//创造的空间要给ps->a
ps->capacity = newCapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps)
{
assert(ps);
assert(ps->top > 0);
ps->top--;
}
STDataType StackTop(ST* ps)
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
int SizeStack(ST* ps)
{
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps)
{
return ps->top == 0;
}
ST path;
ST minpath;
//输出栈里面的坐标路径
void PrintPath(ST* ps)
{
//path数据倒到rpath;
ST rpath;
StackInit(&rpath);
while(!StackEmpty(ps))//不用改变值所以不用传地址
{
StackPush(&rpath,StackTop(ps));
StackPop(ps);
}
while(SizeStack(&rpath)>1)
{
PT top=StackTop(&rpath);
printf("[%d,%d],",top.row,top.col);
StackPop(&rpath);
}
PT top=StackTop(&rpath);
printf("[%d,%d]",top.row,top.col);
StackPop(&rpath);
StackDestroy(&rpath);
}
bool Ispass(int n,int m,int maze[n][m],PT pos)
{
if(pos.row>=0&&pos.row<n&&pos.col>=0&&pos.col<m
&&maze[pos.row][pos.col]==1)
{
return true;
}
else {
return false;
}
}
void StackCopy(ST* path,ST* pcopy)
{
pcopy->a=(STDataType*)malloc(sizeof(STDataType)*path->capacity);
memcpy(pcopy->a,path->a,sizeof(STDataType)*path->top);
pcopy->capacity=path->capacity;
pcopy->top=path->top;
}
void GetMazePath(int n,int m,int maze[n][m],PT cur,int P)
{
StackPush(&path,cur);//把找到的路径入栈
//如果走到出口
if(cur.row==0&&cur.col==m-1)
{
//找到更短路径,更新minpath
if(P>=0&&StackEmpty(&minpath)
|| SizeStack(&path)<SizeStack(&minpath))
{
StackDestroy(&minpath);//先销毁minpath的空间,避免空间泄露
StackCopy(&path,&minpath);//把最短入境拷贝成minpath
}
}
//探测上下左右4个位置
PT next;
maze[cur.row][cur.col]=2;//把找对的位置设置成2
//上
next=cur;
next.row-=1;
if(Ispass(n,m,maze,next))
{
GetMazePath(n,m,maze,next,P-3);
}
//下
next=cur;
next.row+=1;
if(Ispass(n,m,maze,next))
{
GetMazePath(n,m,maze,next,P);
}
//左
next=cur;
next.col-=1;
if(Ispass(n,m,maze,next))
{
GetMazePath(n,m,maze,next,P-1);
}
//右
next=cur;
next.col+=1;
if(Ispass(n,m,maze,next))
{
GetMazePath(n,m,maze,next,P-1);
}
//恢复在来,因为要找最短路径
maze[cur.row][cur.col]=1;
StackPop(&path);//把入栈的数删除了 循环会反复调用所有可以删除掉所有
}
int main() {
int n=0,m=0,P=0;
while(scanf("%d %d %d",&n,&m,&P)!=EOF)
{
int maze[n][m];//输入
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d ",&maze[i][j]);
}
}
//先初始化栈
StackInit(&path);
StackInit(&minpath);
PT entry={0,0};
GetMazePath(n,m,maze,entry,P);
if(!StackEmpty(&minpath))
{
PrintPath(&minpath);
}
else
{
printf("Can not escape!");
}
StackDestroy(&path);
StackDestroy(&minpath);
}
return 0;
}