當前位置:編程學習大全網 - 編程語言 - 堆棧:迷宮老鼠問題,程序有點問題,求大神幫忙

堆棧:迷宮老鼠問題,程序有點問題,求大神幫忙

妳這個方法太復雜了,用回溯法原理上比較簡單,妳先把while((stack!=NULL)||((stack->row!=x2)&&(stack->col!=y2))){改成while(1)試試,不行的話,下面這個方法是我以前編寫的,妳可以看看

#include<stdio.h>

#include<stdlib.h>

#define N 50

int **maze;

int row;

int col;

int stack[50];//存放路徑的棧

void CreateMaze()//用於動態創建迷宮

{

int i,j;

printf("請輸入迷宮的行數:");

scanf("%d",&row);

printf("請輸入迷宮的列數:");

scanf("%d",&col);

if(row<=0||col<=0)

{

printf("輸入的行數或列數不符合規則!\n");

exit(1);

}

//利用指針的指針動態創建二維數組

maze=(int **)malloc((row+2)*sizeof(int *));

for(i=0;i<row+2;i++)

{

maze[i]=(int *)malloc((col+2)*sizeof(int));

}

//加邊墻

for(i=0;i<row+2;i++)

{

maze[i][0]=1;

maze[i][col+1]=1;

}

for(i=0;i<col+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;i<row+2;i++)

{

for(j=0;j<col+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;i<row+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;i<N;i++)

{

stack[i]=0;

}

i=0;

while(1)

{

count=0;//用count判斷是否有路可走

{

if(x==1&&y==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==row&&y==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==row&&y==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==row&&y==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==row&&y==col)

return 1;

}

}

}

if(count==0)

{

if(i<0)

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();

}

  • 上一篇:怎麽獲得PLc程序設計師證書的
  • 下一篇:洗衣機顯示e6是怎麽回事
  • copyright 2024編程學習大全網