洛谷題解 P1596 [USACO10OCT]Lake Counting S
阿新 • • 發佈:2020-09-18
原題傳送門
0.前言 你谷重題水題這麼多......
1.思路
這道題是P1331 海戰的弱化版 ~~~~
實際上就是一個DFS求聯通塊個數的問題
(這一篇題解看不懂的同學不妨看看P1331 海戰的題解)
2.程式碼
#include<iostream> #include<cstdio> using namespace std; inline void read(int &x){ //快讀 int f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } x*=f; } int n,m; char map[101][101]; //存圖 int cnt; //計數 int dx[9]={0,1,-1,0,0,1,-1,-1,1},dy[9]={0,0,0,1,-1,1,1,-1,-1}; //遍歷八個方向 inline void search(int p,int q){ if(p<0||q<0||p>n+1||q>m+1||map[p][q]=='.') return; //邊界條件 map[p][q]='*'; //把同一個水坑標記成一樣的 for(int i=1;i<=8;i++){ if(map[p+dx[i]][q+dy[i]]=='W') search(p+dx[i],q+dy[i]); //還有水就繼續搜 } } int main(){ read(n);read(m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>map[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(map[i][j]=='W'){ //只要有水就開始搜 cnt++; //肯定存在一個水坑 search(i,j); //搜出整個水坑 } } } printf("%d",cnt); return 0; }