1. 程式人生 > 其它 >計蒜客A1139 程式設計:引爆炸彈(簡單深搜)

計蒜客A1139 程式設計:引爆炸彈(簡單深搜)

技術標籤:筆記

題目連結
在一個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; }