計蒜客A1139 程式設計:引爆炸彈(簡單深搜)
阿新 • • 發佈:2021-01-17
技術標籤:筆記
題目連結
在一個n×m 的方格地圖上,某些方格上放置著炸彈。手動引爆一個炸彈以後,炸彈會把炸彈所在的行和列上的所有炸彈引爆,被引爆的炸彈又能引爆其他炸彈,這樣連鎖下去。
現在為了引爆地圖上的所有炸彈,需要手動引爆其中一些炸彈,為了把危險程度降到最低,請算出最少手動引爆多少個炸彈可以把地圖上的所有炸彈引爆。
輸入格式
第一行輸兩個整數 n,m,用空格隔開。
接下來 n 行,每行輸入一個長度為 m 的字串,表示地圖資訊。0表示沒有炸彈,1表示炸彈。
資料約定:
對於 60% 的資料:1≤n,m≤100;
對於 100% 的資料:1≤n,m≤1000;
資料量比較大,不建議用cin輸入。
輸出格式
輸出一個整數,表示最少需要手動引爆的炸彈數。
樣例輸入複製
5 5
00010
00010
01001
10001
01000
樣例輸出複製
2
思路: 建立兩個與地圖相對的行與列陣列在dfs時進行標記;對地圖進行查詢,找到炸彈將座標傳入dfs函式;在函式中分別對行、列的搜尋
程式碼
#include <iostream>
#include <stdio.h>
using namespace std;
char map[1001][1001];
int r[1001] = {0},c[1001] = {0};
int m,n;
void dfs(int x,int y)
{
map[x][y] = '0' ;
if(!r[x]){ //行搜尋
r[x] = 1;
for(int i = 0;i < m;i++){
if(map[x][i] == '1'){
dfs(x,i);
}
}
}
if(!c[y]){ //列搜尋
c[y] = 1;
for(int i = 0;i < n;i++){
if(map[i][y] == '1'){
dfs(i, y);
}
}
}
}
int main()
{
int count = 0;
scanf("%d %d",&n,&m);
for (int i = 0; i < n; i++)
{
scanf("%s",map[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if(map[i][j] == '1'){
count++;
dfs(i,j);
}
}
}
cout<<count;
}