求个c++源码 走迷宫 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓
答案:1 悬赏:70 手机版
解决时间 2021-03-24 18:15
- 提问者网友:我一贱你就笑
- 2021-03-23 20:55
求个c++源码 走迷宫 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓
最佳答案
- 五星知识达人网友:長槍戰八方
- 2021-03-23 21:58
输入地图时:1代表不可通行,0代表可通行,自动增加边框(墙壁),且左上角左边一格为入口,右下角右边一格为出口
编译通过,代码如下:
#include
#include
#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("输入的行数或列数不符合规则!
");
exit(1);
}
//利用指针的指针动态创建二维数组
maze=(int **)malloc((row+2)*sizeof(int *));
for(i=0;i
{
maze[i]=(int *)malloc((col+2)*sizeof(int));
}
//加边墙
for(i=0;i
{
maze[i][0]=1;
maze[i][col+1]=1;
}
for(i=0;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个数:
",i,j);
scanf("%d",&maze[i][j]);
}
}
//输入下一个当前加边墙的迷宫,以验证输入是否正确
printf("输入完毕!当前加边墙的迷宫为:
");
for(i=0;i
{
for(j=0;j {
printf("%d ",maze[i][j]);
}
printf("
");
}
}
void ShowMaze()//输出迷宫
{
int i,j;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
printf("%d ",maze[i][j]);
}
printf("
");
}
}
//释放迷宫数组
void DestroyMaze()
{
int i;
for(i=0;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 {
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("已经找到了一条路径,如下:
");
ShowMaze();
}
else
{
printf("没有合适的路径走出当前迷宫!
");
}
DestroyMaze();
}
编译通过,代码如下:
#include
#include
#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("输入的行数或列数不符合规则!
");
exit(1);
}
//利用指针的指针动态创建二维数组
maze=(int **)malloc((row+2)*sizeof(int *));
for(i=0;i
maze[i]=(int *)malloc((col+2)*sizeof(int));
}
//加边墙
for(i=0;i
maze[i][0]=1;
maze[i][col+1]=1;
}
for(i=0;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个数:
",i,j);
scanf("%d",&maze[i][j]);
}
}
//输入下一个当前加边墙的迷宫,以验证输入是否正确
printf("输入完毕!当前加边墙的迷宫为:
");
for(i=0;i
for(j=0;j
printf("%d ",maze[i][j]);
}
printf("
");
}
}
void ShowMaze()//输出迷宫
{
int i,j;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
printf("%d ",maze[i][j]);
}
printf("
");
}
}
//释放迷宫数组
void DestroyMaze()
{
int i;
for(i=0;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
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("已经找到了一条路径,如下:
");
ShowMaze();
}
else
{
printf("没有合适的路径走出当前迷宫!
");
}
DestroyMaze();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯