迷宫解密问题
搞不明白为什么这个迷宫只能做3*3规模以下的。,。, 大大们伸把手拉一下吧~~~~#include<stdio.h>
#include <stdlib.h>
#include<windows.h>
#define MaxSize 100 //队列最大值
//-------------------------定义数组、队列、及常量----------------------------------------
struct
{
int i; //方块的行数
int j; //方块的列数
int pre; //前一方块在队列中的下标
}Queue[MaxSize]; //定义顺序队列
int front = 0, rear = 0; //定义对头和队尾指针并置初值0
int maze[20][20]; //迷宫的图的二维数组,其四周要加上均为1的外框,最大只能放下19*19的迷宫
int minlen = 0; //最短路径长度
int num = 1; //路径基数
//-----------------------------从队列中输出路径------------------------------------------
void printpath(int front,int N)
{
int u,v;
int k = front, j;
int ns = 0; //用于计算路径长度
do
{
j = k;
k = Queue[k].pre;
ns++;
}while (k!=-1); //k!=-1 保证继续循环
if(num == 1) minlen = ns; //第一条路径就是一条最短路径
if(ns == minlen) //找到其他的最短路径(含第一次找到的最短路径)
{
ns = 0;
k = front;
printf("第%d条最短路径:\n", num++);
do
{
j = k;
maze[Queue[k].i][Queue[k].j] = -1;
k = Queue[k].pre;
}while(k != -1);
for(u=0; u<=N+1; u++)
{
printf("\n\t\t\t\t");
for(v=0; v<=N+1; v++)
{
if(maze[u][v] == -1) printf("◎"), maze[u][v] = 0;
else if(maze[u][v]==1) printf("◆");
else printf(" ");
}
}
printf("\n");
}
}
//------------------------搜索路径为:(x1,y1)->(x2,y2)---------------------------------------------
void mazepath(int x1,int y1,int x2,int y2)
{
int i, j, find=0, direction, k;
rear++;
Queue[rear].i = x1;
Queue[rear].j = y1;
Queue[rear].pre = -1; //(x1,y1)入队 并且做上状态标记
while(front<=rear) //队列不为空时循环
{
front++; //【假】出队
for(direction=0; direction<3; direction++) //循环扫描各个方位,把每个可走的方块插入队列中 问题就在此处~~方向只有四个 导致只能做迷宫大小为4的
{
switch(direction)
{
case 0:i = Queue[front].i-1; j = Queue[front].j; break; //向上一步
case 1:i = Queue[front].i; j = Queue[front].j+1; break; //向右一步
case 2:i = Queue[front].i+1; j = Queue[front].j; break; //向下一步
case 3:i = Queue[front].i; j = Queue[front].j-1; break; //向左一步
}
if((i>0 && j>0) && maze[i][j]==0 && //确保(i,j)方块行进符合逻辑
(i!=Queue[Queue[front].pre].i || j!=Queue[Queue[front].pre].j)) //避免出现回退
{
rear++; //将该相邻方块插入到队列中
Queue[rear].i = i;
Queue[rear].j = j;
Queue[rear].pre = front;//指向方块中上一个方块的下标
}
}
}
for (k=0; k<=rear; k++)
{
if(
Queue[k].i==x2 && Queue[k].j==y2) //找到了出口,输出路径
{
find = 1;
printpath(k, x2);
}
}
if(!find) printf("不存在路径!\n");
}
//----------------------------------------主函数--------------------------------------------
void main()
{
system("color 3E"); //屏幕及字体颜色
SetConsoleTitle("迷宫也疯狂!↖(^ω^)↗ ------老邓制作!"); //屏幕标题
int r=1, END=1;
int N, m, n, p=1, q=1;
int x, y; /*定义并输出迷宫图*/
/*
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ 老邓疯狂迷宫 ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ COME ON! ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("\n");
printf("\n");
printf("\n");
printf("请设置迷宫(正方形)的大小(输入边长):");
scanf("%d",&N);
printf("迷宫大小为%d×%d\n",N,N);
printf("\t\t\t\t迷宫图如下:\n");
//------------------------------------设置迷宫图-------------------------------------
for(m=0; m<=N+1; m++)
{
for(n=0; n<=N+1; n++)
{
if((m==0||m==N+1) || (n==0||n==N+1)) maze[m][n]=1;
else maze[m][n]=0;
}
}
//------------------------------------输出迷宫图--------------------------------------
for(x=0; x<=N+1; x++)
{
printf("\n\t\t\t\t");
for(y=0; y<=N+1; y++)
{
if(maze[x][y]==1) printf("◆");
else printf(" ");
}
}
//-------------------------------设置迷宫障碍物-并输出放置障碍物后的迷宫---------------------------------
do
{
printf("\n设置障碍物位置(例如:'2,3';输入'0,0'退出设置):");
scanf("%d,%d",&p,&q);
system("cls"); //清屏语句,保持窗口的简洁性
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ 老邓疯狂迷宫 ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆ COME ON! ☆☆☆\n");
printf(" ☆☆☆ ☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("\n");
printf("\n");
printf("\n");
maze[p][q] = 1;
for(x=0; x<=N+1; x++)
{ printf("\n\t\t\t\t");
for(y=0; y<=N+1; y++)
{
if(maze[x][y]==1) printf("◆");
else printf(" ");
}
}
}while(p!=0 && q!=0);
//-----------------------------------输出结果-----------------------------------------------
printf("\n按任意键查看结果:\n");
system("pause");
printf("\n从(1,1)到(%d,%d)的最短路径为\n",N,N);
mazepath(1,1,N,N);
printf("\n--------OH YEAR!--------\n");
}