作业题求解,卡住了.总是报错,求解,多谢高手了.
作业题求解,卡住了......总是报错,求解,谢谢高手了...
标题: 迷宫问题
时 限: 100000 ms
内存限制: 100000 K
总时限: 3000 ms
描述: 迷宫问题
迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径.
输入: 迷宫宽度w 迷宫高度h
迷宫第一行
迷宫第二行
...
迷宫第h 行
输出: 入口横坐标1 入口纵坐标1
横坐标2 纵坐标2
横坐标3 纵坐标3
横坐标4 纵坐标4
...
横坐标n-1 纵坐标n-1
出口横坐标n 出口纵坐标n
输入样例: 8 10
1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1
1 0 1 0 0 1 0 1
1 1 0 3 1 0 1 1
1 0 0 1 0 0 4 1
1 0 0 0 0 1 1 1
1 0 1 0 0 1 0 1
1 0 1 0 0 0 1 1
1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1
输出样例: 3 3
2 3
2 4
2 5
3 5
3 6
3 7
4 7
4 6
4 5
4 4
5 4
6 4
标题: 迷宫问题
时 限: 100000 ms
内存限制: 100000 K
总时限: 3000 ms
描述: 迷宫问题
迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径.
输入: 迷宫宽度w 迷宫高度h
迷宫第一行
迷宫第二行
...
迷宫第h 行
输出: 入口横坐标1 入口纵坐标1
横坐标2 纵坐标2
横坐标3 纵坐标3
横坐标4 纵坐标4
...
横坐标n-1 纵坐标n-1
出口横坐标n 出口纵坐标n
输入样例: 8 10
1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1
1 0 1 0 0 1 0 1
1 1 0 3 1 0 1 1
1 0 0 1 0 0 4 1
1 0 0 0 0 1 1 1
1 0 1 0 0 1 0 1
1 0 1 0 0 0 1 1
1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1
输出样例: 3 3
2 3
2 4
2 5
3 5
3 6
3 7
4 7
4 6
4 5
4 4
5 4
6 4
- C/C++ code
#include "stdio.h" #include "stdlib.h" typedef struct stack{ int serial;//序号,可有可无,为了方便就有吧 char x; char y; char dir;//方向,0123代表左上右下 struct stack *prev;//上一个 struct stack *next;//下一个 }Sta,*pSta; int num;//当前栈数 pSta head, temp ,tail; int main() { char **mode1,**mode2; int x,y; int i,j,z; int m1,n1; int m,n; num=0; scanf("%d%d",&x,&y); mode1=(char **)malloc(y*sizeof(char *)); mode2=(char **)malloc(y*sizeof(char *)); for(i=0;i<y;i++) { mode1[i]=(char *)malloc(x*sizeof(char)); mode2[i]=(char *)malloc(x*sizeof(char)); } for(i=0;i<y;i++) for(j=0;j<x;j++) { scanf("%d",&mode1[i][j]); mode2[i][j]=0; } head=(pSta)malloc(sizeof(Sta)); head->next=NULL; temp=tail=head; for(i=0;i<y;i++) for(j=0;j<x;j++) { if(mode1[i][j]==3) { temp->x=i; temp->y=j; temp->serial=num; num++; head=tail=temp; temp->next=(pSta)1; mode2[i][j]=1; goto lv1; } } lv1:for(z=0;z<4;z++) { if( z==0 && ( temp->prev==NULL || temp->prev->dir!=2) )//左边(上一个不能是右边) { m = temp->x+1;n = temp->y;//左边一个点的坐标 if(m>=0 && m<=y && n>=0 && n<=x&& mode2[m][n]==0)//必须是有效点,下同 { if(mode1[m][n]==0)//如果是0,入栈,以下同 { temp->dir = z;//记录最后一次探路方向 temp->next = (pSta)malloc(sizeof(Sta));//栈的新成员 temp->next->prev = temp; temp = temp->next;//temp指向新成员 temp->x = m; temp->y = n; temp->dir = 0;//新成员要从0路劲开始探路 temp->serial = ++num;//新序号 temp->next = (pSta)1; z = -1;//i重置 mode2[m][n]=1; } else if(mode1[m][n]==4)//4结束 { m1=m; n1=n; temp->next = NULL; } } } else if( z==1 && ( temp->prev==NULL || temp->prev->dir!=3) ) { m = temp->x;n = temp->y-1; if(m>=0 && m<=y && n>=0 && n<=x&& mode2[m][n]==0) { if(mode1[m][n]==0 ) { temp->dir = z; temp->next = (pSta)malloc(sizeof(Sta)); temp->next->prev = temp; temp = temp->next; temp->x = m; temp->y = n; temp->dir = 0; temp->serial = ++num; temp->next = (pSta)1; z = -1; mode2[m][n]=1; } else if(mode1[m][n]==4) { m1=m; n1=n; temp->next = NULL; } } } else if( z==2 && ( temp->prev==NULL || temp->prev->dir!=0) ) { m = temp->x-1;n = temp->y; if(m>=0 && m<=y && n>=0 && n<=x&& mode2[m][n]==0) { if(mode1[m][n]==0) { temp->dir = z; temp->next = (pSta)malloc(sizeof(Sta)); temp->next->prev = temp; temp = temp->next; temp->x = m; temp->y = n; temp->dir = 0; temp->serial = ++num; temp->next = (pSta)1; z = -1; mode2[m][n]=1; } else if(mode1[m][n]==4) { m1=m; n1=n; temp->next = NULL; } } } else if( z==3 && ( temp->prev==NULL || temp->prev->dir!=1) ) { m = temp->x;n = temp->y+1; if(m>=0 && m<=y && n>=0 && n<=x&& mode2[m][n]==0) { if(mode1[m][n]==0) { temp->dir = i; temp->next = (pSta)malloc(sizeof(Sta)); temp->next->prev = temp; temp = temp->next; temp->x = m; temp->y = n; temp->dir = 0; temp->serial = ++num; temp->next = (pSta)1; z = -1; mode2[m][n]=1; } else if(mode1[m][n]==4) { m1=m; n1=n; temp->next = NULL; } } } if(temp->next==NULL) break; if(z==3)//到最后路劲依然无解,则出栈 { if(temp->prev!=NULL) { temp = temp->prev; free(temp->next); z = temp->dir; } else { printf("此迷宫无解\n"); return 0; } } } for(temp = head;temp->next!=NULL;temp = temp->next) printf("%d,%d\n",temp->y,temp->x); printf("%d,%d\n",temp->y,temp->x); printf("%d,%d\n",n1,m1); return 0; }