這個帶野可以用 堆棧 來完成。
網站建設哪家好,找創(chuàng)新互聯!專注于網頁設計、網站建設、微信開發(fā)、成都微信小程序、集團企業(yè)網站建設等服務項目。為回饋新老客戶創(chuàng)新互聯還提供了仙游免費建站歡迎大家使用!
用堆棧的基本思路就是。
設置一個起點A。將 A 入棧 。
從A開始找到第一個可以達到的點B。將 B 入棧 。
如果B無路可走。則談橋在A點處重新換一個可達到的點。否則繼續(xù) 2-3 。直到達到終點?;蛘呶迓房勺摺?/p>
詳細的解釋,含行猛這兒有一篇博文:
你這個方法太復雜了,用回溯法原理上比較簡念薯螞單,你先把while((stack!=NULL)||((stack-row!=x2)(stack-col!=y2))){改成while(1)試試,不行的話,下面這個方法是我以前編寫的,你可以看看
#includestdio.h
#includestdlib.h
#define N 50
int **maze;
int row;
int col;
int stack[50];//存放路徑的棧
void CreateMaze()//用于動態(tài)創(chuàng)建迷宮
{
int i,j;
printf("請輸入迷宮的行數:");
scanf("%d",row);
printf("請輸入迷宮的列數:");
scanf("%d",col);
if(row=0||col=0)
{
printf("輸入的行數或列數不符合規(guī)則!\n");
exit(1);
}
//利用指針的指針動態(tài)創(chuàng)建二維數組
maze=(int **)malloc((row+2)*sizeof(int *));
for(i=0;irow+2;i++)
{
maze[i]=(int *)malloc((col+2)*sizeof(int));
}
//加邊墻
for(i=0;irow+2;i++)
{
maze[i][0]=1;
maze[i][col+1]=1;
}
for(i=0;icol+2;i++)
{
if(i==1)
{
maze[0][i]=0;
}
else maze[0][i]=1;
if(i==col)
{
maze[row+1][col]=0;
}
else maze[row+1][i]=1;
}
for(i=1;i=row;i++)
{
for(j=1;j=col;j++)
{
printf("請輸入第%d行的第%d個數:\n",i,j);
scanf("%d",maze[i][j]);
}
}
//輸入下一個當前加邊墻的迷宮,以驗證輸入是否正確
printf("輸入完仔埋畢!當前加邊墻的迷宮為:\n");
for(i=0;irow+2;i++)
{
for(j=0;jcol+2;j++)
{
printf("%d",maze[i][j]);
}
printf("\n");
}
}
void ShowMaze()//輸出迷宮
{
int i,j;
for(i=1;i=row;i++)
{
for(j=1;j=col;j++)
{
printf("%d",maze[i][j]);
}
printf("\n");
}
}
//釋放迷宮數組
void DestroyMaze()
{
int i;
for(i=0;irow+2;i++)
free(maze[i]);
free(maze);
}
//用DFS方法來實現回溯,找到迷宮的一條解路徑
int FindPath()
{
int i,j,k,count,x,y,direction;
count=0;
x=1,y=1;
direction=0;
j=0,k=0;
for(i=0;iN;i++)
{
stack[i]=0;
}
i=0;
while(1)
{
count=0;/手衡/用count判斷是否有路可走
{
if(x==1y==1)
maze[x][y]=2;
if(maze[x][y+1]==0)//東
{
count++;
maze[x][y+1]=2;
y=y+1;
stack[i]=-1;
i++;
if(x==rowy==col)
return 1;
}
else if(maze[x+1][y]==0)//南
{
if(maze[x+1][y]==0)
count++;
{
maze[x+1][y]=2;
x=x+1;
stack[i]=-2;
i++;
if(x==rowy==col)
return 1;
}
}
else if(maze[x][y-1]==0)//西
{
count++;
if(maze[x][y-1]==0)
{
maze[x][y-1]=2;
y=y-1;
stack[i]=-3;
i++;
if(x==rowy==col)
return 1;
}
}
else if(maze[x-1][y]==0)//北
{
count++;
if(maze[x-1][y]==0)
{
maze[x-1][y]=2;
x=x-1;
stack[i]=-4;
i++;
if(x==rowy==col)
return 1;
}
}
}
if(count==0)
{
if(i0)
return 0;
direction=stack[i--];
switch(direction)
{
case -1:y=y-1;break;
case -2:x=x-1;break;
case -3:y=y+1;break;
case -4:x=x+1;break;
default:break;
}
}
}
}
int main()
{
CreateMaze();
if(FindPath())
{
printf("已經找到了一條路徑,如下:\n");
ShowMaze();
}
else
{
printf("沒有合適的路徑走出當前迷宮!\n");
}
DestroyMaze();
}
//這是JDK提供的棧
import java.util.Stack;
public class UsingStack {
public static void main(String[] args) {
//構造棧對象,使用類型限制,只能存儲Integer數據
StackInteger s = new Stack襪衫Integer();
//1、2、3依次入棧
s.push(1);
s.push(2);
s.push(3);
//3、2、1依次出亮尺棧
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
//這是我寫的順序結構的棧
import java.util.EmptyStackException;
import java.util.Vector;
public class UsingStack{
public static void main(String[] args){
//構造棧對象,使用類型限告鍵腔制,只能存儲Integer數據
MyStackInteger s = new MyStackInteger();
//1、2、3依次入棧
s.push(1);
s.push(2);
s.push(3);
//3、2、1依次出棧
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}
/**
* 棧類
* @author developer_05
* @param T
*/
class MyStackT extends VectorT{
/**
* 構造方法
*/
public MyStack(){
}
/**
* 入棧方法
* @param item 待入棧的元素
* @return 返回入棧的元素
*/
public T push(T item) {
addElement(item);
return item;
}
/**
* 出棧方法(同步處理)
* @return 返回出棧元素
*/
public synchronized T pop() {
T obj;
int len = size();
if (len == 0)
throw new EmptyStackException();
obj = elementAt(len - 1);
removeElementAt(len - 1);
return obj;
}
/**
* 判斷棧是否為空的方法
* @return 返回true(棧空)或false(棧非空)
*/
public boolean empty() {
return size() == 0;
}
private static final long serialVersionUID = 1L;
}
#include?stdio.h
#include?time.h
#include?stdlib.h
#include?string.h
#define?MAXM?40??
#define?MAXN?60
int?maze[MAXM][MAXN];?//?0?1-障礙物
int?m?=?40,?n?=?60;?//?40行60列
int?used[MAXM][MAXN];?//?記錄是否到過
int?line[MAXM*MAXN];?//?記錄迷宮路線
int?line_len;
int?line_r[MAXM*MAXN];
int?d[4][2]?=?{?{?1,?0?},?{?0,?1?},?{?-1,?0?},?{?0,?-1}?};?//?4個方向
void?dfs(int?u,?int?v,?int?step)
{
int?x,?y,?i;
if?(line_len?!=?0)
return;
if?(u?==?m-1??v?==?n-1)
{
line_len?=?step;
memcpy(line_r,?line,?line_len*sizeof(int));
return;
}
for?(i?=?0;?i??4;?i++)
{
x?=?u?+?d[i][0];
y?=?v?+?d[i][1];
if?(x?=?0??x??m??y?=?0??y??n??!used[x][y]??maze[x][y]==0)
{
used[x][y]?=?1;
line[step]?=?x??16?|?y;
dfs(x,?y,?step+1);
含山????//?used[x][y]?=?0;?//?不用退回來了,因為只需要一條路徑
}
}
}
int?main()?
{
int?i,?j;
//?隨機生成迷宮
srand(time(NULL));
for?(i?=?0;?i??m;?i++)
for?(j?=?0;?j??n;?j++)
maze[i][j]?=?rand()%8?==?0???1?:?0;?//?是1的概率約1/8,通路的概率大些
maze[0][0]?=?maze[m-1][n-1]?=?0;?//?起始點和終端必須為0
line_len?=?0;
line[0]?=?0??16?|?0;
memset(used,?0,?sizeof(used));
dfs(0,?0,?0);?//?(0,0)?-?(m-1,?n-1)
if?(line_len?==?0)
printf("沒有通路\n");
else
{
for?(i?=?0;?i??line_len;?i++)
printf("(?%d,?%d?)\n",?(line_r[i]16)+1,?(line_r[i]0xffff)+1);
}
return?0;
}
你給的那庫實在是沒什枝老則么用的欲望,要最短路猛棚徑一般用廣度搜索,上面的代碼應該屬于深度搜索