• P1506 拯救oibh总部


    题目背景

    oibh 总部突然被水淹没了!现在需要你的救援……

    题目描述

    oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示,而一个四面被围墙围住的区域洪水是进不去的。

    oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0 表示。

    现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。

    输入格式

    第一行为两个正整数 x,y。

    接下来 x行,每行 y个整数,由 * 和 0 组成,表示 oibh 总部的建设图。

    输出格式

    输出没被水淹没的 oibh 总部的 0 的数量。

    输入输出样例

    输入 #1复制

    4 5
    00000
    00*00
    0*0*0
    00*00

    输出 #1复制

    1
    

    输入 #2复制

    5 5
    *****
    *0*0*
    **0**
    *0*0*
    *****

    输出 #2复制

    5

    说明/提示

    对于 100\%100% 的数据,1 \le x,y \le 5001≤x,y≤500。

     

     


    我的思路是将数组全标记为‘0’,从(1,1)开始将每个数据输入,然后从边界(0,0)开始搜,搜到‘0’就变为‘*’,这样搜的全是外围的,但后再遍历一遍,找到‘0’,有几个答案就是几,但是测试数据有一组超时了,从广搜变为了深搜

    超时代码 

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. char s[505][505];
    4. int n,m;
    5. int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
    6. void bfs(){
    7. queue<pair<int ,int>>q;
    8. q.push(make_pair(0,0));
    9. while(!q.empty()){
    10. auto t=q.front();
    11. q.pop();
    12. s[t.first][t.second]='*';
    13. for(int i=0;i<4;i++){
    14. if((t.first+dx[i])>=0&&(t.first+dx[i])<=n+1&&(t.second+dy[i])>=0&&(t.second+dy[i])<=m+1&&s[t.first+dx[i]][t.second+dy[i]]=='0'){
    15. q.push(make_pair(t.first+dx[i],t.second+dy[i]));
    16. }
    17. }
    18. }
    19. }
    20. int main(){
    21. int ans=0;
    22. memset(s,'0',sizeof(s));
    23. scanf("%d%d",&n,&m);
    24. for(int i=1;i<=n;i++){
    25. for(int j=1;j<=m;j++){
    26. cin>>s[i][j];
    27. if(s[i][j]==0){
    28. s[i][j]='0';
    29. }
    30. }
    31. }
    32. bfs();
    33. for(int i=1;i<=n;i++){
    34. for(int j=1;j<=m;j++){
    35. if(s[i][j]=='0'){
    36. ans++;
    37. }
    38. }
    39. }
    40. printf("%d",ans);
    41. }

     ac代码

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. char s[505][505];
    4. int n,m;
    5. int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
    6. void dfs(int p,int q){
    7. if(p<0||p>n+1||q<0||q>m+1||s[p][q]=='*') return ;//
    8. s[p][q]='*';
    9. for(int i=0;i<4;i++)
    10. dfs(p+dx[i],q+dy[i]);
    11. }
    12. int main(){
    13. int ans=0;
    14. memset(s,'0',sizeof(s));
    15. scanf("%d%d",&n,&m);
    16. for(int i=1;i<=n;i++){
    17. for(int j=1;j<=m;j++){
    18. cin>>s[i][j];
    19. if(s[i][j]==0){
    20. s[i][j]='0';
    21. }
    22. }
    23. }
    24. dfs(0,0);
    25. for(int i=1;i<=n;i++){
    26. for(int j=1;j<=m;j++){
    27. if(s[i][j]=='0'){
    28. ans++;
    29. }
    30. }
    31. }
    32. printf("%d",ans);
    33. }

  • 相关阅读:
    Oracle归档日志暴增排查优化
    TF-IDF算法:从文本中发现价值的黄金法则
    多线程---认识线程
    前端生成二维码
    工作常用之Hive 调优【四】HQL 语法优化
    聊聊Jasypt的StandardPBEByteEncryptor
    python系列笔记——常见运算符:算术运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符,及真题
    远程拉取gitlab问题
    LeetCode 刷题系列 -- 200. 岛屿数量
    39、HumanNeRF
  • 原文地址:https://blog.csdn.net/q619718/article/details/127675819