<span style="color:#330099;">/* E - 广搜记录路径 基础 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 Sample Output (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4) By Grant Yuan 2014.712 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> using namespace std; int a[6][6]; int c[30]; typedef struct{ int x; int y; int f; }node; node s[30]; bool flag[6][6]; int top,base; int best; int next[4][2]={1,0,0,1,-1,0,0,-1}; int res; bool can(int m,int n) { if(m>=0&&m<=4&&n>=0&&n<=4&&flag[m][n]==0&&a[m][n]==0) return 1; return 0; } void slove() {int m,n;int xx,yy; while(top>=base){ if(s[base].x==4&&s[base].y==4) { res=base; break; } xx=s[base].x; yy=s[base].y; for(int i=0;i<4;i++) { m=xx+next[i][0]; n=yy+next[i][1]; if(can(m,n)){ s[++top].x=m; s[top].y=n; s[top].f=base; flag[m][n]=1; } } base++; } } int main() { int i,j; memset(flag,0,sizeof(flag)); for(i=0;i<5;i++) for(j=0;j<5;j++) cin>>a[i][j]; top=-1;base=0; s[++top].x=0; s[top].y=0; s[top].f=0; flag[0][0]=1; slove(); int t=1,v=-1; c[++v]=res; while(1){ t=c[v]; if(t) c[++v]=s[t].f; else break; } for(i=v;i>=0;i--) printf("(%d, %d) ",s[c[i]].x,s[c[i]].y); return 0; } </span>