一个走迷宫程序,看看有什么问题。

NowCan 2003-10-20 05:35:21
/*
迷宫求解
*/
#include <stdio.h>
#include <windows.h>

const long MAZE_SIZE=20;
char maze[MAZE_SIZE][MAZE_SIZE + 1]; //迷宫大小20x20,加1是为了读取文件时存放结束标志
char *filemaze="maze.txt"; //迷宫文件,'#'为墙,'.'为路,'O'为假想墙
long TryX[]={ -1, 0, 1, 0 }; //四个尝试方向
long TryY[]={ 0, -1, 0, 1 };
long step;
bool IsOK;

/*
求解迷宫,参数为起点和终点
*/
void unmaze(long x1, long y1, long x2, long y2)
{
COORD pos={ 0, 0 };
Sleep(100);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
step++;
if(x1 == x2 && y1 == y2) //下一步到达终点
{
IsOK=true; //设定标记
return;
}
else //否则尝试下一步
{
for(long i=0; i < 4; i++) //四个方向尝试
{
if(!IsOK) //如果没有到达终点
{
if(maze[y1 + TryY[i]][x1 + TryX[i]] == '.') //如果下一步可行
{
//printf(" - setp %d: %ld,%ld\n", step, y1 + TryY[i], x1 + TryX[i]);
maze[y1][x1]='O'; //将当前位置变为假想墙,避免路线出现循环
for(long i=0; i < MAZE_SIZE; i++)
{
printf("%s\n", maze[i]);
}

unmaze(x1 + TryX[i], y1 + TryY[i], x2, y2); //尝试下一步
maze[y1][x1]='.'; //取消假想的墙
}
}
}
}
}

/* */
int main(void)
{
FILE *fp;
COORD pos={ 0, 22 };
if((fp=fopen(filemaze, "r")) == NULL)
{
printf(" - Cannot open maze.txt\n");
return 1;
}

for(long i=0; i < MAZE_SIZE; i++)
{
fscanf(fp, "%s", maze[i]);

//printf("%s\n", maze[i]);
}

fclose(fp);
if(maze[1][1] == '#' || maze[18][18] == '#')
{
printf(" - What? Start or end in the wall?\n");
return 0;
}

step=0;
IsOK=false;
system("cls");
unmaze(1, 1, 18, 18);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
if(IsOK)
{
printf(" - OK!\n");
}
else
{
printf(" - No way!\n");
}

return 0;
}

迷宫文件为maze.txt,内容如下。起点(1,1),终点(18,18)
####################
#...#...#......##..#
#.#...#.##.##.....##
#.###...##.######..#
#.######.....##....#
#..######..#....#..#
##.#......########.#
##.##.#####........#
##.##....##.########
#..#..#####.......##
#.#..#..#########..#
#.#.##.###........##
#.#.#######.###.####
#.#......#####.....#
#.#####.....####.###
#...##...##.###....#
###..##.##..#..#.#.#
###.##....#...####.#
#......##.##....#..#
####################
...全文
192 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueSky2008 2003-10-21
  • 打赏
  • 举报
回复
其实只要把第40行
for(long i=0; i < MAZE_SIZE; i++)
{
printf("%s\n", maze[i]);
}
改成

for(long j=0; j < MAZE_SIZE; j++)
{
printf("%s\n", maze[j]);
}

就行了,不过我又多改了一些地方,效果更好一点了,你自己看吧:
跟楼主又学了一招:SetConsoleCursorPosition(); :)


/*
迷宫求解
*/
#include <stdio.h>
#include <windows.h>

const long MAZE_SIZE=20;
char maze[MAZE_SIZE][MAZE_SIZE + 1]; //迷宫大小20x20,加1是为了读取文件时存放结束标志
char *filemaze="maze.txt"; //迷宫文件,'#'为墙,'.'为路,'O'为假想墙
long TryX[]={ -1, 0, 1, 0 }; //四个尝试方向
long TryY[]={ 0, -1, 0, 1 };
long step;
bool IsOK;

/*
求解迷宫,参数为起点和终点
*/
void unmaze(long x1, long y1, long x2, long y2)
{
COORD pos={ 0, 0 };
Sleep(100);

step++;
if(x1 == x2 && y1 == y2) //下一步到达终点
{
IsOK=true; //设定标记
return;
}
else //否则尝试下一步
{
for(long i=0; i < 4; i++) //四个方向尝试
{
if(!IsOK) //如果没有到达终点
{
if(maze[y1 + TryY[i]][x1 + TryX[i]] == '.') //如果下一步可行
{
//printf(" - setp %d: %ld,%ld\n", step, y1 + TryY[i], x1 + TryX[i]);
maze[y1][x1]='O'; //将当前位置变为假想墙,避免路线出现循环

pos.X = x1;
pos.Y = y1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
printf("O");

unmaze(x1 + TryX[i], y1 + TryY[i], x2, y2); //尝试下一步

maze[y1][x1]='.'; //取消假想的墙

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
if(!IsOK) printf(".");

}
}
}
}
}

/* */
int main(void)
{
FILE *fp;
COORD pos={ 0, 22 };
if((fp=fopen(filemaze, "r")) == NULL)
{
printf(" - Cannot open maze.txt\n");
return 1;
}

for(long i=0; i < MAZE_SIZE; i++)
{
fscanf(fp, "%s", maze[i]);

printf("%s\n", maze[i]);
}

fclose(fp);
if(maze[1][1] == '#' || maze[18][18] == '#')
{
printf(" - What? Start or end in the wall?\n");
return 0;
}

step=0;
IsOK=false;
// system("cls");
unmaze(1, 1, 18, 18);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
if(IsOK)
{
printf(" - OK!\n");
}
else
{
printf(" - No way!\n");
}

return 0;
}
woaiyajiaji 2003-10-20
  • 打赏
  • 举报
回复
数据结构的书上使用堆栈作的,
ZhangYv 2003-10-20
  • 打赏
  • 举报
回复
就是广度优先吧,这楼主也很明白。至于错误,最近偶对比较熟悉的问题都不想去看,比较懒... :>
NowCan 2003-10-20
  • 打赏
  • 举报
回复
up吧,明天再来看。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧