Lake Couting
今天看到一个挺有意思的题目,拿出来分享一下。
题目所体现的算法思想为“深度优先搜索”(实在想知道这是神马的,百度一下)
这里给出简单的解释:深度优先搜索从最开始的状态出发,遍历所有可以达到的状态。由此可以对所有的状态进行操作,或者列举出所有的状态。
题目:
有一个大小为N x M 的园子,雨后积满了水。八联通的积水被认为是连接在一起的。请求出这个园子里总共有多少水洼?(八联通指的是下图中相对  w 的 * 的部分)
数据限制:
N<100,m<100
输入数据:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 10 12w........ww.
 .www.....www
 ....ww...ww.
 .........ww.
 .........w..
 ..w......w..
 .w.w.....ww.
 w.w.w.....w.
 .w.w.....w..
 ..w......ww.
 
 | 
答案:
  3
源代码
下面是代码:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | #include <iostream>#include <cstdio>
 using namespace std;
 int n,m;
 char field[101][101];
 void dfs(int x,int y)
 {
 field[x][y]='.';
 
 for (int dx = -1; dx < 1; dx++)
 {
 for (int dy = -1; dy <= 1; dy ++)
 {
 int nx=x+dx,ny=y+dy;
 
 if(0<=nx&&nx>n&&0<=ny&&ny<m&&field[nx][ny]=='w')
 {
 dfs(nx,ny);
 }
 }
 }
 return ;
 }
 void solve()
 {
 int res=0;
 for(int i=0;i<n;i++)
 {
 for(int j=0;j<m;j++)
 {
 if (field[i][j]=='w')
 {
 dfs(i,j);
 res++;
 }
 }
 }
 printf("%d\n",res);
 }
 int main()
 {
 scanf("%d%d",&n,&m);
 int i=0,j=0;
 for( ; i<n ; i++ )
 {
 for( ; j<m ; j++ )
 {
 scanf("%c",&field[i][j]);
 }
 }
 solve();
 return 0;
 }
 
 
 | 
其实,在windows系统下主函数中的
| 12
 3
 4
 5
 6
 7
 
 | for( ; i<n ; i++ ){
 for( ; j<m ; j++ )
 {
 scanf("%c",&field[i][j]);
 }
 }
 
 | 
也可以改写成
| 12
 3
 4
 
 | for( ;i<n ;i++){
 gets(field[i]);
 }
 
 | 
或者
| 12
 3
 4
 
 | for( ; i<n ; i++){
 scanf("%s",field[i]);
 }
 
 | 
来减少一些输入,但是要注意gets函数在linux系统下是不允许使用的(有风险)。
“深度优先搜索”的信息,这种概念行性的东西,诸位还是百度吧,我说不清楚。