在一个 n imes mn×m 的方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。
现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆。
输入格式
第一行输两个整数 n,mn,m,用空格隔开。
接下来 nn 行,每行输入一个长度为 mm 的字符串,表示地图信息。0
表示没有炸弹,1
表示炸弹。
数据约定:
对于 60\%60% 的数据:1 le n, m le 1001≤n,m≤100;
对于 100\%100% 的数据:1 le n, m le 10001≤n,m≤1000;
数据量比较大,不建议用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 }