1 1<br>*<br>3 5<br>*@*@*<br>**@**<br>*@*@*<br>1 8<br>@@****@*<br>5 5 <br>****@<br>*@@*@<br>*@**@<br>@@@*@<br>@@**@<br>0 0 <br>
0<br>1<br>2<br>2<br>
题意:就是一个二维字符数组,里面只有* 或 @,向上、下、左、右、和对角 八个方向检索,判断是否有@,若不能够连续的
检索到@,则继续。求最多有多少组。
题目中An oil deposit will not contain more than 100 pockets.这句话,刚开始我以为是超过100个@就多计数一次呢。
思路:dfs
代码:
#include<iostream> #include<stdlib.h> #include<string.h> using namespace std; int ans = 0; int cou = 0; char point[102][102]; bool flag[102][102]; int m=0, n=0; void bfs(int a,int b) { /*if (cou > 100) { cou = 0; ans++; }*/ if (point[a][b] == '@'&&!flag[a][b]) { flag[a][b] = true; cou++; } else return; if (a - 1 > 0) { if (point[a - 1][b] == '@') { bfs(a - 1, b); } } if (a+ 1 < m) { if (point[a + 1][b] == '@') { bfs(a + 1, b); } } if (b - 1 > 0) { if (point[a][b-1] == '@') { bfs(a, b-1); } } if (b + 1 < n) { if (point[a][b+1] == '@') { bfs(a, b+1); } } if (a - 1 > 0&&b-1>0) { if (point[a - 1][b-1] == '@') { bfs(a - 1, b-1); } } if (a + 1 < m&&b+1<n) { if (point[a + 1][b+1] == '@') { bfs(a + 1, b+1); } } if (a - 1 > 0 && b + 1>0) { if (point[a - 1][b + 1] == '@') { bfs(a - 1, b + 1); } } if (a + 1 < m&&b - 1<n) { if (point[a + 1][b - 1] == '@') { bfs(a + 1, b - 1); } } } int main() { while (1) { int m1, n1; cin >> m1 >> n1; m = m1; n = n1; if (m == 0 && n == 0) break; ans = 0; cou = 0; /* for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) point[i][j]='0'; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) flag[i][j] = false; */ memset(point, 0, sizeof(point)); memset(flag, 0, sizeof(flag)); /* for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cout << flag[i][j]; */ for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cin >> point[i][j]; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { if (point[i][j] == '@'&&flag[i][j]==false) { ans++; bfs(i, j); } } cout << ans << endl; } system("pause"); return 0; }