c语言实现迷宫最优路径选择
中国计量学院实验报告
实验课程:算法与数据结构实验名称:迷宫的最优路径班级:学号:
姓名:实验日期:2013-5-20
实验题目:
输入一迷宫
查找并输出迷宫的最优路径
指导教师:
实验成绩:
1. 定义一个结构体来表示起点和末点的坐标, 定义一个数组来存放迷宫struct elem
{
int x;// 行
int y;// 列
}; // 定义结构体
int M[10][10];
2. 给数组中空白处赋上从起点到该处步骤的值.
int find(int n)
{
for(i=0;i<9;i++)
for(j=0;j<10;j++)
{
if(M[i][j]==n)
{
{if (M[i][j+1]==0) M[i][j+1]=n+1;
else if(M[i][j+1]>n+1) M[i][j+1]=n+1;}
{if (M[i+1][j]==0) M[i+1][j]=n+1;
else if(M[i+1][j]>n+1) M[i+1][j]=n+1;}
{if (M[i][j-1]==0) M[i][j-1]=n+1;
else if(M[i][j-1]>n+1) M[i][j-1]=n+1;}
{if (M[i-1][j]==0) M[i-1][j]=n+1;
else if(M[i-1][j]>n+1) M[i-1][j]=n+1;}
}
}
}
3. 给最优路径附上特定的值, 方便最后的输出.
for (;;)
{
if(M[q.x+1][q.y]==(n-1)) {q.x++;M[q.x][q.y]=0;}
else {if(M[q.x][q.y-1]==(n-1)) {q.y--;M[q.x][q.y]=0;}
else {if(M[q.x-1][q.y]==(n-1)) {q.x--;M[q.x][q.y]=0;}
else if(M[q.x][q.y+1]==(n-1)) {q.y++;M[q.x][q.y]=0;}}}
n--;
if(e.x==q.x&&e.y==q.y) {M[e.x][e.y]=0; break;}
}
四.分析与探讨
程序结果正确,但是没有涉及到栈内容,使用栈可以对程序进一步改进。
五.附录:源代码
#include
#include
struct elem else if(M[i-1][j]>n+1)
{M[i-1][j]=n+1;}
int x;// 行}
int y;// 列}
int di;// 方向,di=1 代表右,di=2 代表}
下,di=3 代表左,di=4 代表上int main(void)
}; // 定义结构体{
struct elem e, q; int k;
int M[10][10]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,- 1}, /* printf(" 请输入迷宫:\n");
{-1, 0, 0,-1, 0, 0, 0,-1, 0,-1}, for(i=0;i<10;i++)
{-1, 0, 0,-1, 0, 0, 0,-1, 0,-1}, for (j=0;j<10;j++)
{-1, 0, 0, 0, 0,-1,-1, 0, 0,-1}, scanf("%d",&M[i][j]);*/
{-1, 0,-1,-1,-1, 0, 0, 0, 0,-1},
{-1, 0, 0, 0,-1, 0, 0, 0, 0,-1}, printf(" 迷宫为:\n");
{-1, 0,-1, 0, 0, 0,-1, 0, 0,-1}, for (i=0;i<10;i++) // 显示迷宫
{-1, 0,-1,-1,-1, 0,-1,-1, 0,-1}, for (j=0;j<10;j++){
{-1,-1, 0, 0, 0, 0, 0, 0, 0,-1}, if(M[i][j]==-1) printf(" #");
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}}; else printf(" ");
int n=1,i,j;// 从起点到某个位置的步骤if(j==9) printf("\n");}
int find(int n)
{printf(" 请输入入口的横纵坐标:\n");
for(i=0;i<9;i++) scanf("%d %d",&e.x,&e.y);
for(j=0;j<10;j++) if(M[e.x][e.y]==-1){printf(" 迷宫走不通
{\n");}
if(M[i][j]==n) M[e.x][e.y]=n;
{printf(" 请输入出口的横纵坐标:\n");
{if (M[i][j+1]==0) scanf("%d %d",&q.x,&q.y);
M[i][j+1]=n+1; if(M[q.x][q.y]==-1){printf(" 迷宫走不通
else if(M[i][j+1]>n+1) \n") ;}
M[i][j+1]=n+1;} for(k=0;k<20;k++)
{find(n);
{if (M[i+1][j]==0) n++;}
M[i+1][j]=n+1; n=M[q.x][q.y];
else if(M[i+1][j]>n+1) M[q.x][q.y]=0;
M[i+1][j]=n+1;}
for (;;)
{if (M[i][j-1]==0) {
M[i][j-1]=n+1; if(M[q.x+1][q.y]==(n-1))
else if(M[i][j-1]>n+1) {q.x++;M[q.x][q.y]=0;}
M[i][j-1]=n+1;} else {if(M[q.x][q.y-1]= =(n-1))
{q.y--;M[q.x][q.y]=0;}
中国计量学院实验报告
else {if(M[q.x-1][q.y]==(n-1))
{q.x--;M【q.x]【q.y]=O;}
else
if(M[q.x][q.y+1]==(n-1))
{q.y++;M【q.x]【q.y]=O;}}}
n--;
if(e.x==q.x&&e.y==q.y) {M[e.x][e.y]=O;
break;}
}
printf(”最优路径为:\n");
for (i=0;i<10;i++) // 显示迷宫和路径,其中#
代表墙,0代表路径,空白处代表可行。
for (j=0;j<10;j++){
if(M[i][j]==-1) printf(" #"); else
if(M[i][j]==0) printf("
0");
else printf("");
if(j==9) printf("\n");}
}
1