題目鏈接
題意
給出一個m行n列的矩陣,@字符表示油田,油田可以八連通,詢問一共有幾個八連塊
解決
- 我想說對於兩個月前(2017.07)的我,我也是連這種簡單的DFS都不會的人(⊙o⊙)…
- 經過暑期集訓會的東西多了好多好多,如果讓我一個人學…怕是要完^_^
- 解決就是DFS深搜一下
- 遍歷每一個是’@’的點,讓ans+1
- 具體可以看下注釋^_^
#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;
}
}