HHUOJ 1114

1114: 屁屁上的巴掌

时间限制: 1 Sec  内存限制: 128 MB
提交: 71  解决: 38
[提交][状态][讨论版][命题人:外部导入]

题目描述

 

小新是个调皮的孩子,他总是会把衣服搞脏,他的妈妈美伢非常的生气,于是在《和妈妈的约定条款》加上了第三百七十七条:小新衣服上每有一块污渍妈妈就会打小新的小屁屁一下作为惩罚。我们规定如果两个污渍相邻(直接相邻的上下左右、左上、左下,右上、右下都算相邻)那么它们就算是一块污渍。现在小新又把衣服搞脏了,请你帮他算一算他的屁股上会挨几巴掌?

 

输入

 

输入将会包含多组测试数据,每组测试数据将会以m和n开头,表示将会用m行n列的网格代表小新的衣服,如果m=0输入结束;1 <= m <= 100 并且1 <= n <= 100.接下来是m行n列的网格,网格中’@’代表污渍,’*’代表没有污渍。

 

输出

 

对于每组数据,请输出小新屁股挨到的巴掌的数量。

 

样例输入

1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0

样例输出

0
1
2
2

DFS,一开始想,写个函数判断周围有没有其他污点就行了,写着写着发现要用递归,然后才知道要用深搜(迟钝。。想通之后就简单了

另外,初始化时,scanf貌似不能直接读入二维数组,会把回车读进去,用cin就行了,要是以后卡了输入怎么办就不知道了,挖坑待填。。

校赛倒计时,加油!

以下是AC代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn = 105;
 9 char board[maxn][maxn];
10 int dx[] = { -1,-1,-1,0,1,1,1,0 };
11 int dy[] = { -1,0,1,1,1,0,-1,-1 };
12 int n, m;
13 void dfs(int x, int y)
14 {
15     for (int i = 0; i < 8; i++)
16     {
17         int tempx = x + dx[i];
18         int tempy = y + dy[i];
19         if (board[tempx][tempy] == '@')
20         {
21             board[tempx][tempy] = '*';
22             dfs(tempx, tempy);
23         }
24     }
25 }
26 int main(void)
27 {
28     int n, m;
29     while (scanf_s("%d%d", &m, &n) != EOF && m != 0)
30     {
31         memset(board, '*', sizeof(board));
32         int i, j;
33         int count;
34         for (i = 1; i <= m; ++i)
35         {
36             for (j = 1; j <= n; ++j)
37             {
38                 cin >> board[i][j];
39             }
40         }
41         for (i = 0; i <= m + 1; ++i)
42         {
43             board[i][0] = '#';
44             board[i][n + 1] = '#';
45         }
46         for (j = 0; j <= n + 1; ++j)
47         {
48             board[0][j] = '#';
49             board[m + 1][j] = '#';
50         }
51         count = 0;
52         for (i = 1; i <= m; ++i)
53         {
54             for (j = 1; j <= n; ++j)
55             {
56                 if (board[i][j] == '@')
57                 {
58                     dfs(i, j);
59                     count++;
60                 }
61             }
62         }
63         cout << count << endl;
64     }
65     return 0;
66 }

 

 
posted @ 2018-12-06 21:09  CofJus  阅读(139)  评论(0编辑  收藏  举报