zoukankan      html  css  js  c++  java
  • 搜索基础_HDU1312_dfs_递归+stack实现+bfs_queue实现

    原题:hdu1312

    B: 不要停下来啊

    题目描述

    丁丁妹因为上山挖大头菜而误打误撞进入了一处古代遗迹,古代遗迹是一个n×m 的迷宫,
    丁丁妹所处的位置用'@'标出,'.'表示道路,'#'表示墙壁。
    为了逃出迷宫,丁丁妹想知道她最长能在迷宫中走多少格。
    我们的目的地根本不重要,只要继续前行就好了,只要不止步,路就在前方!
    所以,不要停下来啊……

    输入描述

    多组数据,第一行为一个正整数T  ,表示数据组数。
    接下来T 组数据,每组格式如下:
    第一行为两个正整数n,m 描述了迷宫的大小。
    接下来一个n×m  的矩阵,元素mat[i][j]是'@','.','#'三者之一,意义见题目描述。
    数据保证:1≤n≤20,1≤m≤20 

    bfs套路queue实现:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include<queue>
     6 using namespace std;
     7 
     8 int n,m;
     9 int T;
    10 char s[25][25];
    11 int dis[4][2]= { //四个方向 ,[][0]代表x轴上的变动,[][1]代表y轴上的变动
    12     {0,1},
    13     {0,-1},
    14     {1,0},
    15     {-1,0}//
    16 };
    17 struct d {
    18     int x,y;
    19 };
    20 int a,b;
    21 int ans=0;
    22 int check(int x,int y) {
    23     if(s[x][y]=='.') {
    24         return 1;
    25     } else {
    26         return 0;
    27     }
    28 }
    29 void f(int x,int y) {
    30     queue<d> q;
    31     d begin,next;
    32     begin.x=x;
    33     begin.y=y;
    34     ans=1;
    35     q.push(begin);
    36     while(!q.empty()) {
    37         begin=q.front();
    38         q.pop();
    39         for(int i=0; i<4; i++) {
    40             next.x=begin.x+dis[i][1];
    41             next.y=begin.y+dis[i][0];
    42             if(check(next.x,next.y)==1) {
    43                 s[next.x][next.y]='#';
    44                 //cout<<next.x<<" "<<next.y<<endl;
    45                 //这个题其实是在找以起点为开始找分叉树,有一点歧义吧
    46                 //如果不是做过我会以为他是在找从起点到死胡同的最长路径,
    47                 // 如果是那样的化就需要检查遇到死胡同的时候用max函数
    48                 //而且不能标记路径而是,找完所有的死胡同
    49 
    50                 q.push(next);
    51                 ans++;
    52             }
    53         }
    54     }
    55 }
    56 
    57 
    58 int main() {
    59     cin>>T;
    60     while(T--) {
    61         cin>>m>>n;
    62         memset(s,'#',sizeof(s));
    63 
    64         for(int i=1; i<=n; i++) {
    65             for(int j=1; j<=m; j++) {
    66                 cin>>s[i][j];
    67                 if(s[i][j]=='@') {
    68                     a=i,b=j;
    69                 }
    70             }
    71         }
    72         /*
    73         for(int i=0; i<=n+1; i++) {
    74             for(int j=0; j<=m+1; j++) {
    75                 cout<<s[i][j];
    76             }
    77             cout<<"
    ";
    78         }
    79         */
    80         f(a,b);
    81 
    82         cout<<ans<<endl;
    83 
    84     }
    85 
    86 
    87     return 0;
    88 }
    View Code

    dfs递归+stack实现 (stack要快一点)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #include <stack>
     6 using namespace std;
     7 int a,b;
     8 char s[24][24];
     9 int T;
    10 int n,m;
    11 int ans=0;
    12 int dis[4][2]= {{1,0},{-1,0},{0,-1},{0,1}};
    13 
    14 void f1(int x,int y) {
    15     for(int i=0; i<4; i++) {
    16         int dx=x+dis[i][0];
    17         int dy=y+dis[i][1];
    18         if(s[dx][dy]=='.') {
    19             ans++;
    20             s[dx][dy]='#';
    21             f1(dx,dy);
    22         }
    23     }
    24 }
    25 
    26 struct d {
    27     int x,y;
    28 };
    29 void f2(int x,int y) {
    30     stack<d> st;
    31     d begin,next;
    32     begin.x=x;
    33     begin.y=y;
    34     ans=1;
    35     st.push(begin);
    36 
    37     while(!st.empty()) {
    38         int g=0;
    39         begin=st.top();
    40         for(int i=0; i<4; i++) {
    41             next.x=begin.x+dis[i][0];
    42             next.y=begin.y+dis[i][1];
    43             if(s[next.x][next.y]=='.') {
    44                 s[next.x][next.y]='#';
    45                 ans++;
    46                 st.push(next);
    47                 g=1;
    48                 break;
    49             }
    50         }
    51         if(g==0)st.pop();
    52 
    53     }
    54 
    55 
    56 }
    57 
    58 
    59 int main () {
    60 
    61     while(cin>>m>>n) {
    62         if(m==n&&n==0)break;
    63     
    64         memset(s,'#',sizeof(s));
    65 
    66         for(int i=1; i<=n; i++) {
    67             for(int j=1; j<=m; j++) {
    68                 cin>>s[i][j];
    69                 if(s[i][j]=='@')a=i,b=j;
    70             }
    71         }
    72         f1(a,b);//f2(a,b);
    73     
    74         cout<<ans<<endl;
    75 
    76     }
    77     return 0;
    78 }    
    View Code

     (f1()需要初始化ans=1)

    老实一点,可爱多了
  • 相关阅读:
    ASP.NET跨页面传值技巧总结
    C#向Sql Server中插入记录时单引号的处理 使用存储过程 .NET教程,C#语言
    在.net平台上如何创建和使用web 服务(C#)
    使用母版页时内容页如何使用css和javascript
    HTML ID和Name属性的区别
    c++/c#中的转义符
    SendMessage 启动屏幕保护程序_2
    sendmessage WM_PAINT带背景的窗体
    UPPERERR.txt
    With do 简化代码语句
  • 原文地址:https://www.cnblogs.com/KID-yln/p/12976908.html
Copyright © 2011-2022 走看看