1. 程式人生 > >NYOJ—水池數目(DFS)

NYOJ—水池數目(DFS)

描述:
校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。
輸入:
第一行輸入一個整數N,表示共有N組測試資料
每一組資料都是先輸入該地圖的行數m(0 < m < 100)與列數n(0 < n < 100),然後,輸入接下來的m行每行輸入n個數,表示此處有水還是沒水(1表示此處是水池,0表示此處是地面)
輸出:
輸出該地圖中水池的個數。
要注意,每個水池的旁邊(上下左右四個位置)如果還是水池的話的話,它們可以看做是同一個水池。
樣例輸入:

2
3 4
1 0 0 0 
0 0 1 1
1 1 1 0
5 5
1 1 1 1 0
0 0 1 0 1
0 0 0 0 0
1 1 1 0 0
0 0 1 1 1

樣例輸出:

2
3

分析:

通過DFS來解決此問題,從任意的‘1’開始,不停地把上下左右四個位置的部分用’0’代替。1次DFS後與初始的’1’連線的所有’1’就都被替換成’0’,這樣直到圖中不存在’1’為止。進行的DFS次數就是水池的數目了。

程式碼如下:

#include<cstdio>
using namespace std;
const int maxn = 100+5;
int p[maxn][maxn];
int r,c;
void dfs(int i,int j)
{
    if(i-1>=0&&p[i-1][j]==1)
    {
        p[i-1
][j]=0; dfs(i-1,j); } if(i+1<r&&p[i+1][j]==1) { p[i+1][j]=0; dfs(i+1,j); } if(j-1>=0&&p[i][j-1]==1) { p[i][j-1]=0; dfs(i,j-1); } if(j+1<c&&p[i][j+1]==1) { p[i][j+1]=0; dfs(i,j+1); } return
; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&r,&c); for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { scanf("%d",&p[i][j]); } } int k=0; for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { if(p[i][j]==1)// 每個點都確認一次是否為1 { dfs(i,j); k++; } } } printf("%d\n",k); } return 0; }

我這裡寫麻煩了,應該將上下左右放在一個數組裡進行迴圈的

int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//表示上下左右四個方向

相關推薦

NYOJ水池數目DFS

描述: 校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。 輸入:

NYOJ-水池數目dfs

水池數目 描述: 南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。 輸入: 第一行輸入一個整數N,表示共有N組測試資料 每一組

nyoj--27--水池數目dfs

水池數目 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述 南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,

NYOJ 27 水池數目 dfs

水池數目 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述        南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某

NYoj最少步數DFS

描述 這有一個迷宮,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,

NYOJ 27 水池數目 BFS,DFS

水池數目 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,

NYOJ 27 水池數目深搜或廣搜

題目很簡單是最基礎的搜尋題 首先是深搜寫法,遞迴 程式碼如下: [cpp] view plaincopyprint? #include<stdio.h> #include<stdlib.h> int m[100][100],a,b;  

The partial sum problem DFSnyoj

The partial sum problem 時間限制:1000 ms  |  記憶體限制:65535 KB 輸入 There are multiple test cases. Each test case contains three lines.The first

DFS連通塊 NYOJ水池數目

題目描述 校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。 輸入 第一行輸入一個整數N,表示共有N組測試資料 每一組資料都是先輸入

NYOJ 27 水池數目DFS

水池數目 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,

NYOJ 722 數獨dfs

數獨 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述          數獨是一種運用紙、筆進行演算的邏輯遊戲。玩家需要根據9×9盤面上的已知數字,推理出所

nyoj 1276 機器裝置DFS

機器裝置 描述 Alpha 公司設計出一種節能的機器裝置。它的內部結構是由 N 個齒輪組成。整個機器裝置有 一個驅動齒輪,當啟動它時,它立即按 10,000 圈/小時轉速順時針轉動,然後它又帶動與它相切 的齒輪反方向,即逆時針轉動。齒輪之間互相作用,每個齒輪

nyoj 32 組合數dfs

描述 找出從自然數1、2、… 、n(0< n< 10)中任取r(0< r<=n)個數的所有組合。 輸入 輸入n、r。 輸出 按特定順序輸出所有組

NYOJ 32 組合數dfs

組合數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3 描述找出從自然數1、2、... 、n(0<n<10)中任取r(0<r<=n)個數的所

nyoj 32-組合數DFS

組合數 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3 描述找出從自然數1、2、... 、n(0<n<10)中任取r(0<r<=n)個數的所有組合。 輸入輸入n、r。 輸出按特定順序輸出所有組合。 特定順序

[ACM] POJ 3740 Easy Finding DFS

cas oss miss 矩陣 org fin contest std size Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16202 Accepted: 4349

ECNU 3260 袋鼠媽媽找孩子dfs

highlight 另一個 () class div names 中一 ble problem 鏈接:http://acm.ecnu.edu.cn/problem/3260/ 題意: 給出一個x,y,k。求從左上角到(x,y)最短路徑不少於k而且最快到達(x,y)的迷宮。(

POJ 2386 Lake CountingDFS

poj 所有 tput algorithm space 答案 復雜度 for pre 題意:有一個大小為N×M的園子,雨後積起了水。八連通的積水被認為是連在一起的。求園子裏一共有多少水窪? * * * * W* (八連通指的就是左圖中相對W的*的部分)

HIT1946 希爾伯特分形曲線dfs

pic ios put 組成 快的 結束 return ext ati 補第二次期末考的題……發現代碼細節還需要加強啊……這樣一道題一直犯小錯誤。 題目鏈接:   http://acm.hit.edu.cn/hoj/problem/view?id=1946 題目描述:

POJ - 3984 - 迷宮問題 DFS

define class ac代碼 ng- art clu cstring fff table 迷宮問題 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10936 Accep