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

📄 1.cpp

📁 用vc++编写的迷宫问题
💻 CPP
字号:

#define MAXNUM 100/* 栈中最大元素个数 */ 
#define N 11  /*地图的第一维长度*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>//使用当前时钟做种子

typedef struct {                                                                                        
       int x;/* 行下标 */ 
       int y;/* 列下标 */ 
       int d;/* 运动方向 */ 
} DataType; 

struct SeqStack { /* 顺序栈类型定义 */ 
    int t; /* 指示栈顶位置 */ 
    DataType s[MAXNUM]; 
}; 

typedef struct SeqStack *PSeqStack; /* 顺序栈类型的指针类型 */ 
PSeqStack pastack; /* pastack是指向顺序栈的一个指针变量 */ 

PSeqStack createEmptyStack_seq( void ) //初始化顺序栈
{ 
    PSeqStack pastack; 
    pastack = (PSeqStack)malloc(sizeof(struct SeqStack)); 
    if (pastack == NULL) 
       printf("Out of space!! \n"); 
    else 
       pastack->t = -1; 
    return pastack; 
} 

int isEmptyStack_seq( PSeqStack pastack )//栈空
 { 
   return pastack->t == -1; 
} 

/* 在栈中压入一元素x */ 
void push_seq( PSeqStack pastack, DataType x ) { 
    if( pastack->t >= MAXNUM - 1 ) 
    printf( "Overflow! \n" ); 
    else { 
    pastack->t++; 
    pastack->s[pastack->t] = x; 
} 
} 

/* 删除栈顶元素 */ 
void pop_seq( PSeqStack pastack )
 { 
    if (pastack->t == -1 ) 
      printf( "Underflow!\n" ); 
    else 
      pastack->t--; 
} 

/* 当pastack所指的栈不为空栈时,求栈顶元素的值 */ 
DataType top_seq( PSeqStack pastack ) 
{ 
    return (pastack->s[pastack->t]); 
} 

void pushtostack(PSeqStack st, int x, int y, int d)
 { 
     DataType element; 
     element.x = x; 
     element.y = y; 
     element.d = d; 
     push_seq(st, element); 
} 

void printpath(PSeqStack st) 
{   FILE *fp;
    if((fp=fopen("a.txt","w"))==NULL)
	{  
		printf("cannot open file\n");
		exit(0);
	}

    DataType element; 
	fputs("The revers path is:",fp);
    printf("The revers path is:\n"); /* 打印路径上的每一点 */ 
    while(!isEmptyStack_seq(st))
	{ 
    element = top_seq(st); 
    pop_seq(st); 
	fprintf(fp,"(%d,%d)", element.x, element.y);
    printf("the node is: %d %d \n", element.x, element.y); 
	} 
    fclose(fp);
} 

/* 迷宫maze[M][N]中求从入口maze[x1][y1]到出口maze[x2][y2]的一条路径 */ 
/* 其中 1<=x1,x2<=M-2 , 1<=y1,y2<=N-2 */ 
void mazePath(int maze[][N], int direction[][2], int x1, int y1, int x2, int y2) 
{  
	FILE *fp;
    if((fp=fopen("a.txt","w"))==NULL)
	{  
		printf("cannot open file\n");
		exit(0);
	}
   int i, j, k, g, h; 
   PSeqStack st; 
   DataType element; 
   st = createEmptyStack_seq( ); 
   maze[x1][y1] = 2; /* 从入口开始进入,作标记 */ 
   pushtostack(st, x1, y1, -1); /* 入口点进栈 */ 

   while ( !isEmptyStack_seq(st)) 
   { /* 走不通时,一步步回退 */ 
	  
      element = top_seq(st); 
     
      i = element.x; j = element.y; 
      for (k = element.d + 1; k <= 3; k++) 
	  { /* 依次试探每个方向 */ 
        g = i + direction[k][0];h = j + direction[k][1]; 
        if (g == x2 && h == y2 && maze[g][h] == 0) 
		{ /* 走到出口点 */ 
             pushtostack(st, g, h, k); /* 进栈 */
             printpath(st); /* 打印路径 */ 
          return; 
		} 
        if (maze[g][h] == 0) { /* 走到没走过的点 */ 
         maze[g][h] = 2; /* 作标记 */ 
         pushtostack(st, g, h, k); /* 进栈 */ 
         i = g; j = h; k = -1; /* 下一点转换成当前点 */ 
		}
	  }
	   pop_seq(st); 
   } 
    fputs("The path has not been found.\n",fp);
    printf("The path has not been found.\n");/* 栈退完未找到路径 */ 
    fclose(fp);
} 
                                             
#define M 8
#define N 11
void Creatmaze(int maze[M][N])
{
    int i, j;
	for(i=0;i<=M-1;i++)
	{
		maze[i][0]=1;
	    maze[i][N-1]=1;
	}
	for(j=0;j<=N-1;j++)
	{
	   maze[0][j]=1;
	   maze[M-1][j]=1;
	}
      srand( (unsigned)time( NULL ) );//初始化随机数
      for(i=1;i<=M-2;i++)
	  {
		for(j=1;j<=N-2;j++)
        maze[i][j]  = rand() % 2; 
	  }
		for(i=0;i<=M-1;i++)
		{
		   for(j=0;j<=N-1;j++)
           printf("%6d",maze[i][j]);
		   printf("\n");
		}
		printf("\n");
}
int menv_select()
{
int s;
printf("请选择:\n");
printf("0.退出\n");
printf("1.随机生成迷宫\n");
printf("2.自定义\n");
for(;;)
{
	scanf("%d",&s);
if (s<0||s>2)
  printf("输入错误,请重新输入");
else
break;
}
return s;
}


int main() 
{ 
	FILE *fp;
	char filename[10];
	printf("请输入文件名(*.txt):");
	scanf("%s",filename);
    if((fp=fopen("a.txt","w"))==NULL)
	{  
		printf("cannot open file\n");
		exit(0);
	}
    
	int maze[M][N];
    int direction[][2]={0,1,1,0,0,-1,-1,0}; 
   for(;;)
   {
   switch (menv_select())
   {
   case 0:
	   printf("结束\n");
	   return 0;

   case 1:
	   Creatmaze(maze);
       mazePath(maze,direction,1,1,6,9);
       break;
   case 2:
      
 int maze[][N]={
  1,1,1,1,1,1,1,1,1,1,1,
  1,0,1,0,0,1,1,1,0,0,1,
  1,0,0,0,0,0,1,0,0,0,1,
  1,0,1,1,1,0,0,0,0,0,1,
  1,0,0,0,1,0,1,1,0,1,1,
  1,1,0,0,1,0,1,1,0,0,1,
  1,1,1,0,0,0,0,0,0,0,1,
  1,1,1,1,1,1,1,1,1,1,1,
  };
  mazePath(maze,direction,1,1,6,9);

   }
   }
}

⌨️ 快捷键说明

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