如下图12×12方格图,找出一条自入口(1,8)到出口(10,7)的最短路径。
测试数据如下:
12 10 7 1 8
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXXXX
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX
对该题进行分析:
运用了队列进行操作,c++提供的queue库却是很好用,节省了很多写程序的步骤,不用自己在去构建队列,写一些入队、出对、判队空什么的函数了。
按照解题思路把经过迷宫每个位置时的最少步数填入可得如下的数据,相信你对这种算法了解的话应该很容易理解。
|
|
|
|
|
|
|
|
|
|
|
|
| 9 | 8 | 7 | 6 | 5 | 4 |
| 0 |
|
|
|
| 10 |
| 8 |
|
| 3 | 2 | 1 | 2 | 3 |
|
| 11 |
| 9 |
|
| 4 |
|
|
| 4 |
|
| 12 |
| 8 | 7 | 6 | 5 | 6 |
| 6 | 5 |
|
| 13 |
|
|
|
|
|
|
|
|
|
|
| 14 | 15 | 16 |
| 22 |
| 24 | 25 | 26 | 27 |
|
| 15 |
|
|
| 21 | 22 | 23 |
|
|
|
|
| 16 | 17 | 18 | 19 | 20 |
| 24 | 25 | 26 | 27 |
|
|
|
| 19 |
|
|
|
| 26 |
| 28 |
|
|
|
|
|
|
|
| 28 | 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//电子老鼠走迷宫
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int a[20][20],s,t; //用a数组来存储迷宫
queue<int> q1;
int n;
void readdata()
{
int i,j,row,col;
char str[20];
scanf("%d",&n);
scanf("%d%d",&row,&col); //起点坐标
s=row*n+col;
scanf("%d%d",&row,&col); //终点坐标
t=row*n+col;
gets(str);
for(i=0;i<n;i++)
{
gets(str);
for(j=0;j<n;j++){
if(str[j]=='.')
a[i][j]=0; //0表示空格
else
a[i][j]=-2; //-2表示墙
}
}
}
int canmoveto(int row,int col,int *p,int *q,int direction)
{
int r,c;
r=row;
c=col;
switch(direction)
{
case 0:c--;break;
case 1:r++;break;
case 2:c++;break;
case 3:r--;
}
*p=r;
*q=c;
if(r<0||r>=n||c<0||c>=n)
return 0;
if(a[r][c]==0)
return 1;
else return 0;
}
int isaim(int row,int col) //判断是否到达目标位置
{
if(row*n+col==t)
return 1;
else return 0;
}
int used(int row,int col) //判断是当前位置是否走过
{
if(a[row][col]==0)
return 0;
else return 1;
}
int Search() //搜索模块
{
int u,row,col,num,r,c,m;
while(!q1.empty())
{
u=q1.front();
q1.pop();
row=u/n;
col=u%n;
num=a[row][col];
for(int i=0;i<4;i++)
{
if(canmoveto(row,col,&r,&c,i))
{
if(isaim(r,c))
return num+1;
if(!used(r,c))
{
a[r][c]=num+1;
m=r*n+c;
q1.push(m);
}
}
}
}
}
int main()
{
int min;
readdata();
q1.push(s);
min=Search();
printf("%d\n",min);
return 0;
}