【队列应用一】随机迷宫|随机起点终点*最短路径算法

  1 #include<iostream>
  2 #include<queue>
  3 #include<windows.h>
  4 #include<time.h>
  5 using namespace std;
  6 struct position     //位置
  7 {
  8     int row;
  9     int col;
 10 };
 11 void display(int size,int **grid);
 12
 13 int main()
 14 {
 15
 16 /*****************************产生随机MAZE,并显示************************************/
 17     int size,i,j,p,q,m,n;
 18     int **grid;
 19     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|
 20     FOREGROUND_GREEN|FOREGROUND_BLUE);//白色
 21     cout<<"please enter the size(边长)of square!(size<100)"<<endl;
 22     cin>>size;
 23     grid=new int *[size+2];      //动态创建二维数组
 24     for(i=0;i<size+2;i++)
 25         {
 26             grid[i] = new int[size+2];        //这个指针数组的每个指针元素又指向一个数组。
 27         }
 28     for(i=0;i<size+2;i++)
 29         {
 30             grid[i][0]=‘y‘;grid[0][i]=‘y‘;
 31             grid[size+1][i]=‘y‘;grid[i][size+1]=‘y‘;
 32         }
 33     srand((unsigned)time(NULL));     //以时间为随机种子
 34     for(i=1;i<=size;i++)
 35     {
 36         for(j=1;j<=size;j++)
 37         {
 38
 39             if(1==rand()%10)     //10%摡率达成
 40                grid[i][j]=‘y‘;
 41             else
 42                 grid[i][j]=0;
 43             }
 44     }
 45             p=rand()%size+1;
 46             q=rand()%size+1;     //随机起点、终点
 47             grid[p][q]=‘g‘;
 48             m=rand()%size+1;
 49             n=rand()%size+1;
 50             grid[m][n]=‘r‘;
 51
 52    display(size,grid);
 53 /**********************************找路********************************
 54    把nbr都压入queue,一个一个弹出在找一下nbr,再压入,直到终点**********************/
 55      position offset[4];   //方向
 56      offset[0].row=1;offset[0].col=0;//right
 57      offset[1].row=0;offset[1].col=-1;//down
 58      offset[2].row=-1;offset[2].col=0;//left
 59      offset[3].row=0;offset[3].col=1;//up
 60
 61      position here;
 62      position nbr;
 63      position finish;
 64      queue<position> Q;
 65
 66      //初始化
 67      here.row=p;here.col=q;
 68      finish.row=m;finish.col=n;
 69      grid[here.row][here.col]=0;
 70      while(true){
 71      for(i=0;i<4;i++)
 72      {
 73          nbr.row=here.row+offset[i].row;
 74          nbr.col=here.col+offset[i].col;
 75          if((nbr.row==finish.row)&&(nbr.col==finish.col))
 76          { grid[finish.row][finish.col]=grid[here.row][here.col]+1;
 77              break;
 78          }
 79          else if(grid[nbr.row][nbr.col]==0)
 80          {grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;
 81          Q.push(nbr);}                     //符合条件的nbr都压进去
 82
 83      }
 84      if((nbr.row==finish.row)&&(nbr.col==finish.col))
 85      { grid[finish.row][finish.col]=grid[here.row][here.col]+1;
 86          break;
 87      }
 88      if(Q.empty())
 89      {
 90          cout<<"no path!"<<endl;
 91          break;
 92      }
 93      here=Q.front();       //取出front
 94      Q.pop();
 95
 96      };
 97 /****************************建造最短路径****************
 98      从终点往回看,每次循环都看和终点计数的差值****************/
 99     here=finish;
100     int length=grid[finish.row][finish.col];
101 for(j=1;j<length;j++)
102 {
103     for(i=0;i<4;i++)
104     {
105         nbr.row=here.row+offset[i].row;
106         nbr.col=here.col+offset[i].col;
107         if(grid[nbr.row][nbr.col]==(grid[finish.row][finish.col]-j))
108         {
109             grid[nbr.row][nbr.col]=‘p‘;               //你都把值改了下一循环成了p-1
110             here=nbr;
111             break;
112         }
113     }
114 }
115 /**********************display**********************************/
116 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |BACKGROUND_RED|
117             BACKGROUND_GREEN | BACKGROUND_BLUE);//白色
118        cout<<"Show you the shortest path!"<<endl;
119        grid[p][q]=‘g‘;
120        grid[m][n]=‘r‘;
121    display(size,grid);
122 return 0;
123 }
124
125 /*********************显示函数***************************************/
126 void display(int size,int **grid)
127 {      int i,j;
128           for(i=0;i<size+2;i++)
129     {
130         for(j=0;j<size+2;j++)
131         {
132             if(grid[i][j]==‘y‘)
133             {
134                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|
135                 BACKGROUND_GREEN);//黄色
136                cout<<‘ ‘<<‘ ‘;
137             }
138
139             else if(grid[i][j]==‘g‘)
140             {
141                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
142                 BACKGROUND_GREEN);   //绿色
143                 cout<<‘ ‘<<‘ ‘;
144             }
145             else if(grid[i][j]==‘r‘)
146             {
147                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
148                 BACKGROUND_RED);   //红色
149                 cout<<‘ ‘<<‘ ‘;
150             }
151             else if(grid[i][j]==‘p‘)
152             {
153                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
154             BACKGROUND_GREEN | BACKGROUND_BLUE);
155                 cout<<‘ ‘<<‘ ‘;
156             }
157             else
158             {    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |BACKGROUND_RED|
159             BACKGROUND_GREEN | BACKGROUND_BLUE);//白色
160             cout<<‘ ‘<<‘ ‘;
161             }
162
163         }
164         cout<<endl;
165     }
166 }

l  时间为种子。白色格子10%概率生成。绿色和红色子块的坐标随机生成。

srand((unsigned)time(NULL));     //以时间为随机种子

for(i=1;i<=size;i++)

{

for(j=1;j<=size;j++)

{

if(1==rand()%10)     //10%摡率达成

grid[i][j]=‘y‘;

else

grid[i][j]=0;

}

}

p=rand()%size+1;

q=rand()%size+1;     //随机起点、终点

grid[p][q]=‘g‘;        //绿色

m=rand()%size+1;

n=rand()%size+1;

grid[m][n]=‘r‘;       //红色

l  Queue:把符合条件的nbr都压入队列,每次弹出一个作为新的here再寻找nbr,直到找到终点。同时如果队列为空,输出no path!并跳出。(具体见程序)

l  颜色设置利用windos.h头文件中的函数,设置了方块背景色。见另随笔。

时间: 2024-07-31 00:26:19

【队列应用一】随机迷宫|随机起点终点*最短路径算法的相关文章

随机迷宫

最近写unity的一个游戏,有一关要实现随机迷宫地图,就查了查随机迷宫实现的算法 随机迷宫设置一个地图,假设地图中都是墙,咱们要种墙中挖出一个通道,这样就可以实现一个随机迷宫. 在每个位置把空间用十字分成四个部分,若是不连通其他通道就接着挖. #include<cstdio> #include<cstdlib> #include<time.h> #include<windows.h> #define MAZE_MAX 50 char map[MAZE_MAX

利用纯JS和HTML Canvas生成随机迷宫过程中产生的有趣的事情

上效果图: #先看生成随机迷宫的代码吧↓ 1 <html> 2 <head> 3 <title>生成随机迷宫v1.0</title> 4 </head> 5 <body> 6 <center style="margin-top: 20px;"> 7 <canvas id="myCan1" title="作者:谢辉"></canvas> 8

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

SDUT-2449_数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

HDU2066一个人的旅行---(多起点多终点最短路径)

http://acm.hdu.edu.cn/showproblem.php?pid=2066 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36107    Accepted Submission(s): 12313 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,

随机Prim法创建随机迷宫(C#实现)

因为这两天想参加一个比赛,所以就在上网找素材,刚好看到了迷宫生成,就决定拿这个开刀了. 参考的原文地址为(来源页面) 源地址中是使用AS实现的,没学过AS,所以直接不会运行,于是就自己根据原文的概念进行了模(chao)仿(xi). 废话说完了,现在来说一下随机Prim法的原理: 1.建立两个数组,一个是用于存储地图的二维数组α,另一个是用于存储待处理的墙的数组β. 2.将α的所有方格全部初始化为墙. 3.选定起点,并将该位置的墙变为路,将其四周的四块置入β数组中(出界的直接筛掉,就不说了). 4

hdu 1240 3维迷宫 求起点到终点的步数

题意,给出一个N,这是这个三空间的大小,然后给出所有面的状况O为空地,X为墙,再给出起始点的三维坐标和终点的坐标,输出到达的步数 比较坑 z是x,x是y,y是z,Sample InputSTART 1O0 0 00 0 0ENDSTART 3XXXXXXXXXOOOOOOOOOXXXXXXXXX0 0 12 2 1ENDSTART 5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOOO

随机梯度下降的逻辑回归算法(SGDLR)

由于第一次实验的实验报告不在这台机器,先写这一算法吧. SGDLR(the Stochastic Gradient Descent for Logistic Regression),要讲解这一算法,首先要把名字拆为几块. 1 随机   2 梯度下降   3逻辑回归 先贴一篇文章:http://blog.csdn.net/zouxy09/article/details/20319673 这篇文章中解释的还不错. 其实这一算法,通俗来讲是这样子的: 1.手中肯定有很多带有label标记的数据,这是训

从N个元素的集合中随机取m个元素的算法实现

最近有一个需求,比较简单,就是如标题所说的,从N个元素中随机取m个元素,当然这m个元素是不能存在重复的.本以为这么简单的需求,应该有现成的工具类来实现,但是几次查找居然没找到(有知道的可以推荐下哈^_^).只好自己实现了下. 自己的实现思路也不知道是不是有问题,或者还有没有更好的思路来实现,所以在这里贴出来,供有兴趣的猿友提提建议.找找问题,或者找到更好的实现思路. 废话不多说,直接上代码(java实现) /** * 随机取num个从0到maxVal的整数.包括零,不包括maxValue * @