UVA 572 Oil Deposits(DFS)

題目鏈接

題意

給出一個m行n列的矩陣,@字符表示油田,油田可以八連通,詢問一共有幾個八連塊

解決

  1. 我想說對於兩個月前(2017.07)的我,我也是連這種簡單的DFS都不會的人(⊙o⊙)…
  2. 經過暑期集訓會的東西多了好多好多,如果讓我一個人學…怕是要完^_^
  3. 解決就是DFS深搜一下
  4. 遍歷每一個是’@’的點,讓ans+1
  5. 具體可以看下注釋^_^
#include<bits/stdc++.h>
using namespace std;

int m,n;
char maps[105][105];
void dfs(int i,int j)
{
    maps[i][j]='*';                 //把@字符變成普通字符,要不搜索過程中可能會回退回來,變成無限循環。。。
    int di,dj,ni,nj;
    for(int di=-1;di<=1;di++)
    {
        for(int dj=-1;dj<=1;dj++)   //有的人喜歡用數組表示移動的方向,我喜歡這樣子表示^_^
        {
            ni=i+di;nj=j+dj;        //如果是隻能向四個方向移動,可以加一句if(di*dj!=0) continue;
            if(ni<0||nj<0||ni>m||nj>n) continue;    //座標合法性
            //if(di*dj!=0) continue;
            if(maps[ni][nj]=='@')
                dfs(ni,nj);         //接續搜索下一個位置
        }
    }
}
int main()
{
    while(1)
    {
        int ans=0;
        scanf("%d%d",&m,&n);
        if(!m||!n) break;

        getchar();
        for(int i=0;i<m;i++) scanf("%s",maps[i]);

        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(maps[i][j]=='@')
                {
                    dfs(i,j);           
                    ans++;              //掃描到一個@之後,dfs函數會把與它相連的所有@都清空掉,所以每次便利到@都讓ans+1
                }
            }
        }
        cout<<ans<<endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章