#include<iostream>
using namespace std;
void EnQueue(int i,int j,int k); //入队一个节点
void DeQueue(int *i,int *j,int *k); //获取当前节点的序号和对应的迷宫坐标,然后出列
bool GetNextPos(int *i ,int *j,int count); //得到下一个邻接点的位置
void ShortestPath_BFS(int i,int j); //广度优先遍历寻找最短路径
void ShortestPath(); //输出最短路径
void Print(); //输出迷宫形状
int Map[10][10] = {{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1}};
struct Node
{
int parent_id; //保存父节点的位置
int node_id; //当前节点的序号,以便传递给孩子节点
int x,y; //当前结点对应的坐标
}Q[10*10]; //每个节点包含迷宫坐标、队列中的序号、父节点的序号,多个节点形成队列
int front = 0,rear = 0; //队列头指针和尾指针
void main()
{
printf("程序说明:\n");
printf("1.输出路径为最短路径;\n");
printf("2.默认的出口在最右下角,如有需要可以调整。\n");
printf("初始地图如下:\n");
Print();
int i,j;
reinput:
printf("请输入起点坐标(x,y):\n ");
scanf("%d%d",&i,&j);
if(Map[i][j])
{
printf("不能从该处出发,请重新输入!\n");
goto reinput;
}
ShortestPath_BFS(i,j);
printf("最短路径之一如下:\n");
ShortestPath();
}
void EnQueue(int i,int j,int k)
{
Q[rear].x = i;
Q[rear].y = j; //保存当前节点对应的坐标位置
Q[rear].parent_id = k; //保存父节点的序号
Q[rear].node_id = rear; //保存当前节点序号
rear++;
}
void DeQueue(int *i,int *j,int *k)
{
*i = Q[front].x;
*j = Q[front].y;
*k = Q[front].node_id;
front++; //出列一个节点
}
bool GetNextPos(int *i ,int *j,int count)
{
switch(count)
{
case 1:(*j)++; return 1; //右
case 2:(*i)++; return 1; //下
case 3:(*j)--; return 1; //左
case 4:(*i)--; return 1; //上
default: return 0;
}
}
void ShortestPath_BFS(int i ,int j)
{
int count,m,n,k;
EnQueue(i,j,-1); Map[1][1] = 1; //起点入队,标记起点已走过
while(true)
{
count = 1;
DeQueue(&i,&j,&k);
n = i,m = j; //保存当前位置
while(GetNextPos(&i,&j,count))
{
count++;//
if(!Map[i][j])
{
EnQueue(i,j,k); Map[i][j] = 1;
if(i == 8 && j == 9) return; //到达终点,(8,9)是默认终点,可以任意修改
}
i = n; j = m; //保证遍历当前坐标的所有相邻位置
}
}
}
void ShortestPath()
{
int i,j,k,sum(0) ;
k = rear-1;
while(k != -1)
{
i = Q[k].x; j = Q[k].y;
Map[i][j] = 2;
k = Q[k].parent_id;
}
printf(" 0 1 2 3 4 5 6 7 8 9\n");
for(i = 0;i < 10;i++)
{
cout<<i;
for(j = 0;j < 10;j++)
if(Map[i][j]==2)
{
sum++; printf("□");
}
else
printf("■");
printf("\n");
}
printf("最短路径长度: %d\n",sum);
}
void Print()
{
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl;
for(int i = 0;i < 10;i++)
{
cout<<i;
for(int j = 0;j < 10;j++)
if(Map[i][j]) printf("■");
else
printf("□");
printf("\n");
}
}
using namespace std;
void EnQueue(int i,int j,int k); //入队一个节点
void DeQueue(int *i,int *j,int *k); //获取当前节点的序号和对应的迷宫坐标,然后出列
bool GetNextPos(int *i ,int *j,int count); //得到下一个邻接点的位置
void ShortestPath_BFS(int i,int j); //广度优先遍历寻找最短路径
void ShortestPath(); //输出最短路径
void Print(); //输出迷宫形状
int Map[10][10] = {{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1}};
struct Node
{
int parent_id; //保存父节点的位置
int node_id; //当前节点的序号,以便传递给孩子节点
int x,y; //当前结点对应的坐标
}Q[10*10]; //每个节点包含迷宫坐标、队列中的序号、父节点的序号,多个节点形成队列
int front = 0,rear = 0; //队列头指针和尾指针
void main()
{
printf("程序说明:\n");
printf("1.输出路径为最短路径;\n");
printf("2.默认的出口在最右下角,如有需要可以调整。\n");
printf("初始地图如下:\n");
Print();
int i,j;
reinput:
printf("请输入起点坐标(x,y):\n ");
scanf("%d%d",&i,&j);
if(Map[i][j])
{
printf("不能从该处出发,请重新输入!\n");
goto reinput;
}
ShortestPath_BFS(i,j);
printf("最短路径之一如下:\n");
ShortestPath();
}
void EnQueue(int i,int j,int k)
{
Q[rear].x = i;
Q[rear].y = j; //保存当前节点对应的坐标位置
Q[rear].parent_id = k; //保存父节点的序号
Q[rear].node_id = rear; //保存当前节点序号
rear++;
}
void DeQueue(int *i,int *j,int *k)
{
*i = Q[front].x;
*j = Q[front].y;
*k = Q[front].node_id;
front++; //出列一个节点
}
bool GetNextPos(int *i ,int *j,int count)
{
switch(count)
{
case 1:(*j)++; return 1; //右
case 2:(*i)++; return 1; //下
case 3:(*j)--; return 1; //左
case 4:(*i)--; return 1; //上
default: return 0;
}
}
void ShortestPath_BFS(int i ,int j)
{
int count,m,n,k;
EnQueue(i,j,-1); Map[1][1] = 1; //起点入队,标记起点已走过
while(true)
{
count = 1;
DeQueue(&i,&j,&k);
n = i,m = j; //保存当前位置
while(GetNextPos(&i,&j,count))
{
count++;//
if(!Map[i][j])
{
EnQueue(i,j,k); Map[i][j] = 1;
if(i == 8 && j == 9) return; //到达终点,(8,9)是默认终点,可以任意修改
}
i = n; j = m; //保证遍历当前坐标的所有相邻位置
}
}
}
void ShortestPath()
{
int i,j,k,sum(0) ;
k = rear-1;
while(k != -1)
{
i = Q[k].x; j = Q[k].y;
Map[i][j] = 2;
k = Q[k].parent_id;
}
printf(" 0 1 2 3 4 5 6 7 8 9\n");
for(i = 0;i < 10;i++)
{
cout<<i;
for(j = 0;j < 10;j++)
if(Map[i][j]==2)
{
sum++; printf("□");
}
else
printf("■");
printf("\n");
}
printf("最短路径长度: %d\n",sum);
}
void Print()
{
cout<<" 0 1 2 3 4 5 6 7 8 9"<<endl;
for(int i = 0;i < 10;i++)
{
cout<<i;
for(int j = 0;j < 10;j++)
if(Map[i][j]) printf("■");
else
printf("□");
printf("\n");
}
}