迷宫问题(广度优先)

参考数据结构一书第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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值