⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 迷宫.txt

📁 sfsf szfsz
💻 TXT
字号:
迷宫求解问题虽然是一类经典问题,但是其实原理并不难,说白了就是栈的应用,我想你可能比我还清楚。^_^ 
你的问题很好解决,由于栈中存储的是迷宫的各个点的位置,这样来说在操作完毕后就可以记载所有走过的道路,而栈中的元素个数就是相当于走过的路的长度,如果你有一点图论的基础,可以了解到,实际上关于路的问题,一般都会涉及到权值问题,所谓权值说白了就是路的长短,在迷宫问题里面,每一个点的权值看作是相同的,这样一来,再栈中的元素个数越少,这条路经就越短,只要在你的程序结构体中定义一个计数器,记载栈中元素的个数,最后比较计数器的大小问题就迎刃而解了。程序的实现并不难,你自己试试吧。

bool FindPath(Position start,Position finish,int &PathLen,Position * &path) 
{ 
if((start.row==finish.row)&&(start.col==finish.col)) //当初末位置相等时停止 
{ 
PathLen=0; 
return true; 
} 
for(int i=0;i<=m+1;i++) //使四周都为1 
grid[0][i]=grid[n+1][i]=1; 
for(i=0;i<=n+1;i++) 
grid[i][0]=grid[i][m+1]=1; 
// Position *offset=new Position[4]; //定义对象的指针表示位置的四周值的变化 
Position offset[4]; 
offset[0].row=0;offset[0].col=1; 
offset[1].row=1;offset[1].col=0; 
offset[2].row=0;offset[2].col=-1; 
offset[3].row=-1;offset[3].col=0; 
int Numofnbrs=4; //相邻的方格数 
Position here,nbr; //定义两个对象,表示初始位置 
here.row=start.row; 
here.col=start.col; 
grid[start.row][start.col]=2; 
Queue<Position> Q;//(100); //待考查的方格队列 
do //标记可达相邻方格 
{ 
for(int i=0;i<Numofnbrs;i++) 
{ 
nbr.row=here.row+offset[i].row; //相邻的方格 
nbr.col=here.col+offset[i].col; 
if(grid[nbr.row][nbr.col]==0) //该方格未标记 
{ 
grid[nbr.row][nbr.col]=grid[here.row][here.col]+1; 
if((nbr.row==finish.row)&&(nbr.col==finish.col)) break; //完成布线(该点的四周) 
Q.EnQueue(nbr); //标式的点进栈 
} 
} 
if((nbr.row==finish.row)&&(nbr.col==finish.col)) break; //全部的布线 
if(Q.Empty()) return false; 
Q.DeQueue(here); //取出下一个考察的方格 
} 
while(true); 
PathLen=grid[finish.row][finish.col]-2; //构造最短的路线 
path=new Position[PathLen]; 
here=finish; 
for(int j=PathLen-1;j>=0;j--) 
{ 
path[j]=here; //?????? 
for(int i=0;i<=Numofnbrs;i++) //找到前驱位置 
{ 
nbr.row=here.row+offset[i].row; 
nbr.col=here.col+offset[i].col; 
if(grid[nbr.row][nbr.col]==j+2) break; 
} 
here=nbr; //向前移动 
} 
return true; 
} 

这是最短线路的源代码!!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -