zoukankan      html  css  js  c++  java
  • 迷宫 dfs爆搜

    本人水平有限,题解不到为处,请多多谅解

    本蒟蒻谢谢大家观看

    题目:
    迷宫
    (maze.cpp/in/out 1s 256M)
    最近,小Y在玩一款迷宫游戏,游戏是在一个n? m的网格上进行的,每个
    格子可能是空地或者障碍物。游戏一开始,玩家控制的角色位于图中的某块空地
    上。在游戏过程中,玩家可以用上下左右键控制角色向相邻且没有障碍物的格子
    移动(当然,角色不能移动到地图之外,也不能对角线移动)。游戏的目标是收
    集地图上出现的星星(每个星星只能收集一次),收集的数量越多分数越高。小
    Y刚开了一局游戏,假设游戏时间没有限制,他想知道自己最多能收集到多少个
    星星。
    Input
    第一行包含两个正整数n和m,表示游戏的地图包含n行m列。
    接下来给出一个n×m的字符矩阵,每个字符可能为以下几种:
    ● #:表示该位置有障碍物
    ● . (英文句号):表示该位置是空地
    ● *:表示该位置是空地,且生成了一颗星星
    ● S :表示该位置是空地,且玩家初始时位于该位置,保证图中有且只有一个S
    1≤n,m≤200。
    Output
    共一行,包含一个整数,表示最多能收集到多少颗星星
    Sample Input
    4 8
    ..#...*.
    *.#.S#..
    ######..
    .*..#.*.
    Sample Output
    2

    直接爆搜,两个if分别判断'.'和'*',来进行dfs

    code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int dx[5]={1,0,-1,0};
     4 int dy[5]={0,1,0,-1};
     5 bool bb[210][210];
     6 char mpa[210][210];
     7 int n,m,ans=0;
     8 void inint(){
     9     freopen("maze.in","r",stdin);
    10     freopen("maze.out","w",stdout);
    11 }
    12 inline int read(){
    13     int x=0,f=1;char ch=getchar();
    14     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    15     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    16     return x*f;
    17 }
    18 void dfs(int x,int y)
    19 {
    20     for(int k=0;k<4;k++)
    21     {
    22         if(mpa[x+dx[k]][y+dy[k]]=='*'&&bb[x+dx[k]][y+dy[k]]==false){
    23             ans++;
    24             bb[dx[k]+x][dy[k]+y]=true;
    25             dfs(x+dx[k],y+dy[k]);
    26         }
    27         if(bb[x+dx[k]][y+dy[k]]==false&&(mpa[x+dx[k]][y+dy[k]]=='.'))
    28         {
    29             bb[x+dx[k]][y+dy[k]]=true;
    30             dfs(x+dx[k],y+dy[k]);
    31         }
    32     }
    33 } 
    34 int main()
    35 {
    36     //inint();
    37     n=read(),m=read();
    38     for(int i=1;i<=n;i++)
    39     for(int j=1;j<=m;j++)
    40         cin>>mpa[i][j];
    41         
    42     for(int i=1;i<=n;i++)
    43     for(int j=1;j<=m;j++)
    44     {
    45         if(mpa[i][j]=='S')
    46         dfs(i,j);
    47     }
    48     printf("%d
    ",ans);
    49     return 0;
    50 }
    51 /*
    52 4 8 
    53 ..#...*. 
    54 *.#.S#.. 
    55 ######.. 
    56 .*..#.*.
    57 */
  • 相关阅读:
    spring入门
    mybatis环境配置与入门例子
    wine 魔兽争霸
    不要再使用工具格式化代码!!!
    Android 动画 setVisibility 后出错解决方法
    AbsListView.OnScrollListener 使用注意事项
    linux 配置 wlan 连接
    练习:求完数问题
    重写:求比指定数大且最小的“不重复数”问题
    emacs 快捷键笔记
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11679797.html
Copyright © 2011-2022 走看看