• 计蒜客-A1139 dfs


    在一个 n imes mn×m 的方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。

    现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆。

    输入格式

    第一行输两个整数 n,mn,m,用空格隔开。

    接下来 nn 行,每行输入一个长度为 mm 的字符串,表示地图信息。0表示没有炸弹,1表示炸弹。

    数据约定:

    对于 60\%60% 的数据:1 le n, m le 1001n,m100;

    对于 100\%100% 的数据:1 le n, m le 10001n,m1000;

    数据量比较大,不建议用cin输入。

    输出格式

    输出一个整数,表示最少需要手动引爆的炸弹数。

    样例输入

    5 5
    00010
    00010
    01001
    10001
    01000

    样例输出

    2

    题解:

    你首先要明白一点,如果你第一次点燃1号炸弹能引爆2、3、4、5、6号炸弹,那么你第一次点燃2号炸弹同样也能引爆1、3、4、5、6号炸弹,点燃3、4、5、6号炸弹也是这样

    那么我们就随机挑出来一个炸弹先点燃它,把由这个炸弹引燃的炸弹删去,再从剩下的炸弹中在挑选一个,,,依次进行,知道没有炸弹为止

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<vector>
     7 #include<queue>
     8 #include<map>
     9 using namespace std;
    10 typedef long long ll;
    11 const int maxn=1010;
    12 const int INF=0x3f3f3f3f;
    13 int Map[maxn][maxn];
    14 int m,n,ans=0;
    15 int row[maxn];
    16 int col[maxn];
    17 int dfs(int i,int j)
    18 {
    19     Map[i][j]=0;
    20     if(!col[j])
    21     {
    22         col[j]=1;
    23         for(int k=1; k<=n; k++)
    24         {
    25             if(Map[k][j]==1)
    26             {
    27                 dfs(k,j);
    28                 //Map[k][j]=0;
    29             }
    30 
    31         }
    32     }
    33     if(!row[i])
    34     {
    35         row[i]=1;
    36         for(int l=1; l<=m; l++)
    37         {
    38             if(Map[i][l]==1)
    39             {
    40                 dfs(i,l);
    41                 //Map[i][l]=0;
    42             }
    43 
    44         }
    45     }
    46 }
    47 int main()
    48 {
    49     scanf("%d%d",&n,&m);
    50     for(int i=1; i<=n; i++)
    51     {
    52         for(int j=1; j<=m; j++)
    53         {
    54             scanf("%1d",&Map[i][j]);   //%1d代表就输入一个数字就结束此次输入
    55         }
    56     }
    57     for(int i=1; i<=n; i++)
    58     {
    59         for(int j=1; j<=m; j++)
    60         {
    61             if(Map[i][j]==1)
    62             {
    63                 dfs(i,j);
    64                 ans++;
    65             }
    66         }
    67     }
    68     printf("%d
    ",ans);
    69     return 0;
    70 }
  • 相关阅读:
    Key&Main Window
    ObjectiveC Runtime IV 【使用隐藏的参数】
    JS中的变量作用域
    Git配置
    ObjectiveC Runtime II 【发送消息 vs 调用函数】
    GDB Vs. WinDbg Commands
    mcs51 串口通信 单片机发 pc收
    csharp截屏
    解决WIN7系统中系统文件的“拒绝访问”的方案
    在VC中创建DLL文件的方法步骤
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12736008.html
Copyright © 2020-2023  润新知