参考数据结构一书第50页(严蔚敏),主要是运用广搜,在迷宫中输出一条最短路径,以下是我的代码。
#include<iostream>
#include<string>
#include<windows.h>
using namespace std;
void SetColor(unsigned short ForeColor,unsigned short BackGroundColor)//控制win32框架颜色
{
//HANDLE GetStdHandle(DWORD nStdHandle);
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);//或得缓存区句柄
//STD_OUTPUT_HANDLE 标准输出语句
//STD_INPUT_HANDLE 标准输入的句柄
//STD_ERROR_HANDLE 标准错误的句柄
SetConsoleTextAttribute( hCon,BackGroundColor);//设置文本以及背景颜色
//BOOL SetConsoleTextAttribute(
//HANDLE hConsoleOutput, console 屏幕缓冲区的句柄
//WORD wAttributes // 文本及背景的颜色//)
}
int x1,y1,n,m,step;
int x2,y2;
int went[4][2]={1,0,0,1,-1,0,0,-1};
int visit[100][1000];
char map[100][100];
char map1[100][100];
struct Queue{
int x;
int y;
int z;
};
int FindLoad(Queue L[])
{
int front=0,real=1,temp;
int midx,midy,flag=0;
L[front].x=x1;
L[front].y=y1;
L[front].z=0;
temp=real;
step=front;
while(front<real)
{
for(int k=front;k<real;k++){
if(flag==1)
step++;
flag=1;
for(int i=0;i<4;i++)
{
midx=L[k].x+went[i][0];
midy=L[k].y+went[i][1];
if(map[midx][midy]=='.'||map[midx][midy]=='P'&&midx>=0&&midx<n&&midy>=0&&midy<m)
{
L[temp].x=midx;
L[temp].z=step;
L[temp++].y=midy;
map[midx][midy]='*';
if(map[x2][y2]=='*')
return 0;
}
}
real=temp;
}
front=real;
}
return -1;
}
int main()
{
Queue list[10000];
int i,j;
while(cin>>n>>m)
{
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>map[i][j];
map1[i][j]=map[i][j];
visit[i][j]=0;
if(map[i][j]=='O'){
x1=i;
y1=j;
}
if(map[i][j]=='P'){
x2=i;
y2=j;
}
}
int key=FindLoad(list);
if(key==0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
while(step!=0)
{
visit[list[step].x][list[step].y]=1;
step=list[step].z;
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(visit[i][j]==1)
{
SetColor(40,12);
cout<<1;
SetColor(40,15);//黑底白字
}
else
cout<<map1[i][j];
}
cout<<endl;
}
}
system("pause");
return 0;
}