队列应用一随机迷宫|随机起点终点*最短路径算法
Posted 隅子酱的blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列应用一随机迷宫|随机起点终点*最短路径算法相关的知识,希望对你有一定的参考价值。
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头文件中的函数,设置了方块背景色。见另随笔。
以上是关于队列应用一随机迷宫|随机起点终点*最短路径算法的主要内容,如果未能解决你的问题,请参考以下文章