找个时间又了解了各个版本的迷宫代码,勉强弄了个来凑合看。不过这个代码不作讲解了,只能勉强凑合。不考虑最短路径的情况下还是可以理解的。
不敢保证大环境下能正常运行,重点看实现方面的逻辑结构就行。

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define H 10
#define W 15
char M[H][W] =
{
{8,8,8,8,8,8,8,8,8,8,8,8},
{8,8,5,8,8,8,8,8,8,8,8,8},
{8,5,5,5,5,5,5,5,5,8,8,8},
{8,8,8,5,5,5,5,8,5,5,5,8},
{8,8,8,5,5,7,8,8,8,8,5,8},
{8,5,5,5,5,5,5,5,5,5,5,8},
{8,5,8,8,8,5,5,8,5,5,8,8},
{8,5,8,8,8,8,5,8,8,5,8,8},
{8,5,5,5,6,8,5,5,5,5,5,8},
{8,8,8,8,8,8,8,8,8,8,8,8}
};
void find_id( char[][],int*,int* );
void fun( char [][],int,int );
int judge_move( char[][],int,int,int );
void re_way( char[][],int[][],int,int );
void print( char[][] );
int main( void )
{
int x;
int y;
find_id(M,&x,&y);
fun(M,x,y);
return 0;
}
void fun( char m[H][W],int x,int y )
{
int com[4][2] =
{
{0,-1},{-1,0},{0,1},{1,0}
};
int t_x = x;
int t_y = y;
int div = 0;
int mark = 0;
int flag;
while (1)
{
const int t_div = ( div + 3 ) % 4;
const int d_x = com[t_div][0];
const int d_y = com[t_div][1];
flag = judge_move( m,x + d_x, y + d_y,t_div );
if ( flag == 0 )
{
m[x][y] = div = t_div;
x += d_x;
y += d_y;
}
else if ( flag == 1)
div = (++div % 4);
else if ( flag == 2)
{
m[x][y] = t_div;
break;
}
if ( x == t_x && y == t_y && ( ++mark == 4 ) )
break;
}
if ( flag == 2 )
re_way(m,com,t_x,t_y);
else
{
m[x][y] = 6;
print(m);
puts("没路!");
}
}
int judge_move( char m[H][W],int x,int y,int t_div )
{
#define ABS(n) ((n) >= 0 ? (n) : (-(n)))
if ( m[x][y] == 7 )
return 2;
if ( m[x][y] == 5 )
return 0;
return ( m[x][y] == 8 || ( ABS(m[x][y] - t_div) != 2 ));
#undef ABS
}
void re_way( char m[H][W],int com[4][2],int x,int y )
{
while ( m[x][y] != 7 )
{
const int t = m[x][y];
m[x][y] +=10;
x += com[t][0];
y += com[t][1];
print(m);
getch();
}
}
void print( char m[H][W] )
{
static char s_c[] =
{ ' ',' ',' ',' ','*',' ','O','X','#','$','<','^','>','v'};
size_t i;
size_t j;
system("cls");
for ( i = 0; i != H; ++i )
for ( j = 0; j != W + 1; ++ j )
putchar(j != W?s_c[m[i][j]]:'\n');
}
void find_id( char m[H][W], int* x,int* y )
{
size_t i;
size_t j;
unsigned flag = 0;
for ( i = 0; i != H; ++i )
for ( j = 0; j != W; ++ j )
if ( ( m[i][j] ==6 ) && flag <=1 )
{
*x = i;
*y = j;
++flag;
}
if ( flag == 1 )
return ;
else if (flag == 0 )
puts("没有起点!");
else
puts("起点不止一个");
exit(EXIT_FAILURE);
}
逐步输出路径能更直观。
[此贴子已经被作者于2021-6-1 00:25编辑过]