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 }