用栈和队列实现迷宫求解

用栈实现,深度搜索

#include<iostream>

#include<cstring>
#include<stack> 
using namespace std;
struct node{
    int x,y,d;//横纵坐标和方向 
};
stack<node>s;
int path(int map[10][10],int move[8][2]){
    node temp;
    int x,y,d,i,j;
    temp.x=1;temp.y=1;temp.d=-1; //入口点
    s.push(temp);
    while(!s.empty()){
          temp=s.top();
          s.pop();
          x=temp.x;  y=temp.y; d=temp.d+1;
          while(d<8){
               i=x+move[d][0]; j=y+move[d][1];
               if(map[i][j]==0){
                    temp.x=x;temp.y=y;temp.d=d;
                    s.push(temp);
                    x=i;y=j;
                    map[x][y]=-1;
                    if(i==8 && j==8)
                        return 1;
                    else 
                        d=0;                               
               }
               else 
                   d++;
          }                                
    } 
   return 0;   
}
void output(int map[10][10]){
    for(int i=0;i<10;i++) {
       for(int j=0;j<10;j++)    
          cout<<map[i][j]<<" "; 
      cout<<endl;
     }
}
int main(){
     
    int map[10][10];
    memset(map,0,sizeof(map));
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
             if(j==0 || j==9 || i==0 ||i==9)
                 map[i][j]=1;
             else 
                map[i][j]=0;
        }
    }
    map[1][3]=map[1][7]=map[2][3]=map[2][7]=1;
    map[3][5]=map[3][6]=1;
    map[4][2]=map[4][3]=map[4][4]=1;
    map[5][4]=1;
    map[6][2]=map[6][6]=1;
    map[7][2]=map[7][3]=map[7][4]=map[7][6]=map[7][7]=1;
    map[8][1]=1;
    map[1][1]=0;//入口 
    map[8][8]=0;//出口 
    int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //8个方向 
    cout<<"地图如下:"<<endl; 
    output(map); 
    system("pause");
    path(map,move);
    cout<<"路径如下:"<<endl;
    node t;
    while(!s.empty()){
         t=s.top();
         s.pop();
         cout<<"("<<t.x<<","<<t.y<<") ";                              
    }
    cout<<endl;
system("pause");
return 0;
}

用队列实现,广度搜索,找出的是最短路径

#include<iostream>
#include<cstring>
#include<queue> 
using namespace std;
struct node{
    int x,y;//横纵坐标
};
int path(int map[10][10],int move[8][2]){
     queue<node>q;
     int x,y;
     node temp;
     temp.x=1;temp.y=1;
     q.push(temp);
     map[1][1]=8;  //搜索过的不能再搜
     while(!q.empty()){
          temp=q.front();                  
          q.pop();
          for(int i=0;i<8;i++){
              x=temp.x+move[i][0];
              y=temp.y+move[i][1];
              if(map[x][y]==0){
                  temp.x=x;
                  temp.y=y;
                  q.push(temp);
                  map[x][y]=8;
              }
              if(map[8][8]==8)  //搜索过出口点说明已找到出口 
                   return 1; 
          } 
     } 
     return 0;  
}
void output(int map[10][10]){
    for(int i=0;i<10;i++) {
       for(int j=0;j<10;j++)    
          cout<<map[i][j]<<" "; 
      cout<<endl;
     }
}
int main(){
     
    int map[10][10];
    memset(map,0,sizeof(map));
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
             if(j==0 || j==9 || i==0 ||i==9)
                 map[i][j]=1;
             else 
                map[i][j]=0;
        }
    }
    map[1][3]=map[1][7]=map[2][3]=map[2][7]=1;
    map[3][5]=map[3][6]=1;
    map[4][2]=map[4][3]=map[4][4]=1;
    map[5][4]=1;
    map[6][2]=map[6][6]=1;
    map[7][2]=map[7][3]=map[7][4]=map[7][6]=map[7][7]=1;
    map[8][1]=1;
    map[1][1]=0;//入口 
    map[8][8]=0;//出口 
    int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //8个方向 
    cout<<"地图如下:"<<endl; 
    output(map); 
    system("pause");
    if(path(map,move))
        cout<<"已找到出口"<<endl;
    else 
        cout<<"靠,没出口"<<endl; 
    cout<<"尝试如下:"<<endl;
    output(map);
system("pause");
return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值