数据结构迷宫问题求解输入迷宫总是少一行怎么办?

问题遇到的现象和发生背景 求解迷宫问题直接把迷宫写入代码成功运行但是输入迷宫总是少一行
问题相关代码,请勿粘贴截图 Status InitMaze(MazeType *M){

//初始化迷宫数据
int i,j;
int COLUMN,ROW;
printf("请输入迷宫行数:");
scanf("%d",&ROW);
printf("请输入迷宫列数:");
scanf("%d",&COLUMN);
char mz[100][100];
M->maze=(char **)malloc(sizeof(char )(ROW+1));
M->footprint=(int **)malloc(sizeof(int )(ROW+1));
if(!M->maze||!M->footprint){
printf("申请空间失败,迷宫非法初始化.\n");
return ERROR;
exit(0);
}
for(i=0;i<=ROW;i++){
M->maze[i]=(char )malloc(sizeof(char)(COLUMN+1));
M->footprint[i]=(int )malloc(sizeof(int)(COLUMN+1));
if(!M->maze[i]||!M->footprint[i]){
printf("申请空间失败,迷宫初始化失败.\n");
return ERROR;
exit(0);
}
}
for(i=0;i<=ROW;i++){
for(j=0;j<=COLUMN;j++){
mz[i][j]='2';
M->footprint[i][j]=0;
}
}
printf("请输入迷宫\n");
for(i=1;i<=ROW;i++){

for(j=1;j<=COLUMN;j++){
    scanf("%d",&mz[i][j]);
    }

}
for(i=0;i<=ROW;i++){
for(j=0;j<=COLUMN;j++){
M->maze[i][j]=mz[i][j];
}
}
M->row=ROW;//行
M->column=COLUMN;//列
return OK;
}

运行结果及报错内容 无法正确输入迷宫怀疑将回车键一并输入但是不知道如何改正
我的解答思路和尝试过的方法
我想要达到的结果

你输入迷宫是int类型的,但是定义的是char类型,所以不对
scanf("%d",&mz[i][j])

设置1为通路0为障碍在迷宫上侧和左侧设定了墙壁赋值为2

img


#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int Status;
typedef struct{//迷宫类型
char **maze;//迷宫数据
int **footprint;//足迹数据
int row;//行数
int column;//列数
}MazeType;
typedef struct{//迷宫位置坐标
int x;
int y;
}PosType;
typedef struct{
int ord;//当前位置在路径上的"序号"
PosType seat;//当前位置在迷宫中的"坐标位置"
int di;//从当前位置走向下一个位置的"方向"
}SElemType; //栈元素类型
typedef struct{//顺序栈结构定义
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack *S);
//构造一个空栈S
Status InitMaze(MazeType *M);
//初始化迷宫数据
Status DestroyStack(SqStack *S);
// 销 毁 栈 S,S 不 再 存 在
Status ClearStack(SqStack *S);
//把栈S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(SqStack S);
//返回S元素的个数,即栈的长度
Status GetTop(SqStack S,SElemType *e);
//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回FALSE
Status Push(SqStack *S,SElemType e);
//插入元素e为新的栈顶元素
Status Pop(SqStack *S,SElemType *e);
//若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
Status StackTraverse(const SqStack *S);
//从栈底到栈顶依次对每个元素进行访问,并输出栈内元素即路径
Status PrintMaze(MazeType *M);
//输出迷宫
Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end);
//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底
//到栈顶),并返回TRUE;否则返回FALSE
Status FootPrint(MazeType *M,PosType pos);
//将迷宫的当前位置pos设置为"走过",即footprint该位置为1
Status Pass(MazeType *M,PosType pos);
//判断当前位置是否能通过
SElemType NewSElem(int step,PosType pos,int d);
//创建新结点,用step,pos,d初始化该结点
PosType NextPos(PosType pos,int d);
//将位置pos的方向设为d
Status MarkPrint(MazeType *M,PosType pos);
//将迷宫M的pos位置,设为已走,成功返回OK;否则返回ERROR
int main()
{
MazeType maze;//迷宫结构
SqStack stack;//顺序栈,存储迷宫路径
PosType start,end;//迷宫的起点和终点
printf("请输入迷宫的起点:(如:1,2)\n");
scanf("%d,%d",&(start.x),&(start.y));
printf("请输入迷宫的终点:(如:5,6)\n");
scanf("%d,%d",&(end.x),&(end.y));
InitMaze(&maze);//迷宫初始化
printf("迷宫形状:\n");
PrintMaze(&maze);//打印迷宫形状
if(TRUE==MazePath(&stack,maze,start,end))
printf("迷宫可解.\n");
else
printf("迷宫不可解.\n");
return 0;
}

Status InitStack(SqStack *S){
//构造一个空栈S
S->base=(SElemType )malloc(STACK_INIT_SIZEsizeof(SElemType));
if(!S->base)//分配失败
{
printf("分配内存失败.\n"); exit(0);
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}

Status InitMaze(MazeType *M){
//初始化迷宫数据
int i,j;
int COLUMN,ROW;
printf("请输入迷宫行数:");
scanf("%d",&ROW);
printf("请输入迷宫列数:");
scanf("%d",&COLUMN);
char mz[100][100];
M->maze=(char **)malloc(sizeof(char )(ROW+1));
M->footprint=(int **)malloc(sizeof(int )(ROW+1));
if(!M->maze||!M->footprint){
printf("申请空间失败,迷宫非法初始化.\n");
return ERROR;
exit(0);
}
for(i=0;i<=ROW;i++){
M->maze[i]=(char )malloc(sizeof(char)(COLUMN+1));
M->footprint[i]=(int )malloc(sizeof(int)(COLUMN+1));
if(!M->maze[i]||!M->footprint[i]){
printf("申请空间失败,迷宫初始化失败.\n");
return ERROR;
exit(0);
}
}
for(i=0;i<=ROW-1;i++){
for(j=0;j<=COLUMN-1;j++){
mz[i][j]='2';
M->footprint[i][j]=0;
}
}
printf("请输入迷宫\n");
for(i=1;i<=ROW;i++){

for(j=1;j<=COLUMN;j++){
    scanf("%c",&mz[i][j]);
    }

}
for(i=0;i<=ROW;i++){
for(j=0;j<=COLUMN;j++){
M->maze[i][j]=mz[i][j];
}
}
M->row=ROW;//行
M->column=COLUMN;//列
return OK;
}

Status DestroyStack(SqStack *S){
//销毁栈S,S不再存在
if(!S)//S为空
{
printf("指针为空,释放失败.\n");
exit(0);
}
free(S);
return OK;
}

Status ClearStack(SqStack *S){
//把栈S置为空栈
if(!S)//S不存在
return FALSE;
S->top=S->base;//直接将栈顶指针指向栈底
return OK;
}

Status StackEmpty(SqStack S){
//若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top==S.base)
return TRUE;
else
return FALSE;
}

int StackLength(SqStack S){
//返回S元素的个数,即栈的长度
return S.stacksize;
}
Status GetTop(SqStack S,SElemType *e){
//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回FALSE
if(S.top==S.base){
printf("栈为空.\n");
return FALSE;
}
else{
e=(S.top-1);
printf("栈顶元素:%c\n",*e);
return OK;
}
}

Status Push(SqStack *S,SElemType e){
//插入元素e为新的栈顶元素
if(S->top-S->base>=S->stacksize){//栈已满,追加存储空间
S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base)
{
printf("重新申请空间失败.\n");
exit(0);
}
S->top=S->base+S->stacksize;//更改栈顶指针
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}

Status Pop(SqStack *S,SElemType *e){
//若栈S不为空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S->top==S->base){//栈为空
printf("栈为空.\n");
return ERROR;
}
e=(--S->top);
return OK;
}

Status StackTraverse(const SqStack *S){
//从栈底到栈顶依次对每个元素进行访问
SElemType *p=S->base;
if(S->base==S->top)
{
printf("栈为空.\n");
return FALSE;
}
printf("栈中元素:");
while(p!=S->top)
{
printf("(%d,%d)->\n",p->seat.x,p->seat.y);
*p++;
}
printf("\n");
return OK;
}

Status PrintMaze(MazeType *M){
//输出迷宫
int i,j;
for(i=1;i<=M->row;i++){
for(j=1;j<=M->column;j++){
printf("%c",M->maze[i][j]);
}
printf("\n");
}
printf("\n");
return OK;
}

Status MazePath(SqStack *S,MazeType maze,PosType start,PosType end){
//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底
//到栈顶),并返回TRUE;否则返回FALSE
int curstep=1;//当前步数
SElemType e;
PosType curpos=start;//当前位置
InitStack(S);//初始化栈
do{
if(TRUE==Pass(&maze,curpos)){
FootPrint(&maze,curpos);
e=NewSElem(curstep,curpos,1);
Push(S,e);
if((curpos.x==end.x)&&(curpos.y==end.y)){//到达终点
printf("迷宫路径:\n");
StackTraverse(S);
return TRUE;
}
curpos=NextPos(curpos,1);
curstep++;
}//if
else{//当前位置不能通过
if(!StackEmpty(*S)){
Pop(S,&e);
while(e.di==4&&!StackEmpty(*S)){
MarkPrint(&maze,e.seat);
Pop(S,&e);
}//while
if(e.di<4){
e.di++;
Push(S,e);
curpos=NextPos(e.seat,e.di);
}//if
}//if
}//else
}while(!StackEmpty(*S));
return FALSE;
}
Status FootPrint(MazeType *M,PosType pos){
//将迷宫的当前位置pos设置为"走过",即footprint该位置为1
if((pos.x>M->row)||(pos.y>M->column))
return FALSE;
M->footprint[pos.x][pos.y]=1;
return TRUE;
}
Status Pass(MazeType *M,PosType pos){
//判断当前位置是否可通
if((M->row<pos.x)||(M->column<pos.y)){
printf("位置越位.\n");
exit(0);
}
if((0==M->footprint[pos.x][pos.y])&&(M->maze[pos.x][pos.y]=='1'))
return TRUE;
else
return FALSE;
}
SElemType NewSElem(int step,PosType pos,int d){
//创建新结点,用step,pos,d初始化该结点
SElemType e;
e.ord=step;
e.seat=pos;
e.di=d;
return e;
}
PosType NextPos(PosType pos,int d){
//获取pos位置d方向的位置
switch(d){
case 1://东
pos.x++;
break;
case 2://南
pos.y++;
break;
case 3://西
pos.x--;
break;
case 4://北
pos.y--;
break;
default:
printf("位置编号出错.\n");
}
return pos;
}
Status MarkPrint(MazeType *M,PosType pos){
//将迷宫M的pos位置,设为已经过,成功返回OK;否则返回ERROR
if(pos.x>M->row||pos.y>M->column){
printf("所要标记位置越位.\n");
return ERROR;
}
M->footprint[pos.x][pos.y]=1;
return OK;
}

为什么你截图中显示输入的迷宫行数是6,
但是实际看你的输入迷宫只有5行?
这行后面的代码

printf("请输入迷宫\n");

改成这样试下

printf("请输入迷宫\n");
for(i=0;i<=ROW-1;i++){
for(j=0;j<=COLUMN-1;j++){
    scanf("%d",&mz[i][j]);
    }
}

你试下能不能跑出来