zoukankan      html  css  js  c++  java
  • 搜索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数组,这样即简单而且不容易错,

    这里就步演示了

  • 相关阅读:
    Python之CVXOPT模块
    JavaScript之读取和写入cookie
    jQuery学习(2)ajax()使用
    JavaScript之使用AJAX(适合初学者)
    Jquery焦点图实例
    jquery-mobile表单提交问题
    程序员笔记|Spring IoC、面向切面编程、事务管理等Spring基本概念详解
    使用什么调试swoole程序
    swoole模块的编译安装:php编译安装swoole模块的代码
    TP5使用Redis处理电商秒杀
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7347270.html
Copyright © 2011-2022 走看看