zl程序教程

您现在的位置是:首页 >  其它

当前栏目

计蒜客-A1139 dfs

DFS 计蒜客
2023-09-27 14:26:03 时间

在一个 n \times 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\n",ans);
69     return 0;
70 }