微信扫一扫打赏支持

搜索4--noi6264:走出迷宫

搜索4--noi6264:走出迷宫

一、心得

可以去看看别人的代码,吸收精华

 

二、题目

6264:走出迷宫

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
输出
输出从起点到出口最少需要走的步数。
样例输入
3 3
S#T
.#.
...
样例输出
6

三、分析

典型的BFS

 

四、AC代码

  1 //6264:走出迷宫
  2 #include <iostream>
  3 #include <queue>
  4 using namespace std;
  5 //n表示行,m表示列 
  6 int n,m;
  7 //上右下左 
  8 int runRow[4]={1,0,-1,0};
  9 int runColumn[4]={0,1,0,-1};
 10 //迷宫 
 11 char maze[105][105];
 12 //起点和终点
 13 int startR,startC,endR,endC; 
 14 //描述点的结构体 
 15 struct node{
 16     int row;//
 17     int column;//
 18     int minStep;//到每个点的最短步数
 19 }; 
 20 //每个点是否被访问
 21 bool vis[105][105]; 
 22 
 23 queue<node> mazeQueue; 
 24 
 25 void readData(){
 26     cin>>n>>m;
 27     for(int i=1;i<=n;i++){
 28         for(int j=1;j<=m;j++){
 29             cin>>maze[i][j];
 30             //找到起点和终点 
 31             if(maze[i][j]=='S'){
 32                 startR=i;
 33                 startC=j;
 34             }else if(maze[i][j]=='T'){
 35                 endR=i;
 36                 endC=j;
 37             }
 38         }
 39     }
 40 } 
 41 
 42 void printMaze(){
 43     for(int i=1;i<=n;i++){
 44         for(int j=1;j<=m;j++){
 45             cout<<maze[i][j]<<" ";
 46         }
 47         cout<<endl;
 48     }
 49     cout<<"start:"<<startR<<"."<<startC<<endl;
 50     cout<<"end:"<<endR<<"."<<endC<<endl;
 51 }
 52 
 53 void search(int startR,int startC){
 54     node *p=new node;
 55     //设置起点 
 56     p->row=startR;
 57     p->column=startC;
 58     p->minStep=0;
 59     //把起点添加至队列 
 60     mazeQueue.push(*p); 
 61     vis[startR][startC]=true;
 62     //访问所有点的可能情况
 63     
 64     while(!mazeQueue.empty()){
 65         node q=mazeQueue.front();
 66         mazeQueue.pop();
 67 //        cout<<"node: "<<q.row<<" "<<q.column<<" "<<q.minStep<<endl;
 68 //        cout<<"------------------------------------------------"<<endl;
 69 //        cout<<"q.row: "<<q.row<<"q.column: "<<q.column<<endl;
 70 //        cout<<"endR: "<<endR<<"endC: "<<endC<<endl;
 71 //        cout<<"------------------------------------------------"<<endl;
 72         if(q.row==endR&&q.column==endC){
 73             cout<<q.minStep<<endl;
 74             break;
 75         }else{
 76             for(int i=0;i<=3;i++){
 77                 int row1=q.row+runRow[i];
 78                 int column1=q.column+runColumn[i];
 79                 
 80                 if(row1>=1&&row1<=n&&column1>=1&&column1<=m&&(maze[row1][column1]=='.'||maze[row1][column1]=='T')&&!vis[row1][column1]){
 81 //                    cout<<"row1: "<<row1<<"column1: "<<column1<<endl;
 82                     vis[row1][column1]=true;
 83                     node *p1=new node;
 84                     p1->row=row1;
 85                     p1->column=column1;
 86                     p1->minStep=q.minStep+1;
 87                     mazeQueue.push(*p1);
 88                 }    
 89             }
 90         }
 91         
 92     } 
 93     
 94 }
 95 
 96 int main(){
 97     //freopen("in.txt","r",stdin);
 98     readData();
 99     search(startR,startC);
100     //printMaze();
101     return 0;
102 }

 

五、注意点

1、迷宫中不只为'.'的可以走,为‘T’的也可以走

 

2、基于第一点,所以可以优化代码,所有按照能不能走来来标识为true或者false

这样的话就只需要vis数组,而不需要maze数组,这样即简单而且不容易错,

这里就步演示了

 

posted @ 2017-08-11 18:08  范仁义  阅读(555)  评论(0编辑  收藏  举报