标题:迷宫解密问题
取消只看楼主
蜀山小二V
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-12-15
结帖率:100%
已结贴  问题点数:20 回复次数:1 
迷宫解密问题
搞不明白为什么这个迷宫只能做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");
}



搜索更多相关主题的帖子: 解密 把手 include 最大值 
2011-12-19 10:27
蜀山小二V
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-12-15
得分:0 
真的改了好几天了。。。一直改不出来。。。
2011-12-19 10:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-358108-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.733876 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved