标签:otto c11 distinct 输入 blog 文件 enter 传感器 scanf
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Problem Description - 题目描述
GeoSurvComp地质勘测公司勘测底下石油。
GeoSurvComp每次处理一块大型矩形区域,并用一个网格将其划分为若干正方形格子。然后使用传感器分析各个格子是否埋藏石油。
藏有石油的格子则被称为口袋。如果两个口袋相邻,则属于同一片石油。石油可能很大并包含多个口袋。你的任务是测定网格上有多少片石油。
输入文件有若干个网格。 每个网格第一行有m和n,表示行与列,以一个空格分隔。 如果m=0则结束输入。此外1 <= m <= 100 且 1 <= n <= 100。 随后m行,每行n个字符(不含行尾字符)。每个字符表示一个格子,`*‘表示没有石油,`@‘表示一个石油袋。
Output - 输出
对于每个网格,输出有多少片石油。属于同一片石油的相邻口袋关系为水平,重置,或对角线。每片石油不超过100个口袋。
Sample Input - 输入样例
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output - 输出样例
0 1 2 2
题解
水题。
直接拿FZU 2150前半部分的代码稍微改改就A了,不超过100的条件并没有什么用。
BFS和DFS应该没区别……都能做。
代码 C++
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #define MX 105 5 struct Point{ 6 int y, x; 7 } now, nxt; 8 char map[MX][MX]; 9 int fx[16] = { 1, 0, -1, 0, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1, 1 }; 10 std::queue<Point> q; 11 int main(){ 12 int m, n, opt, i, j, k; 13 while (scanf("%d%d ", &m, &n), m + n){ 14 opt = 0; 15 memset(map, ‘*‘, sizeof map); 16 for (i = 1; i <= m; ++i) gets(&map[i][1]); 17 18 for (i = 1; i <= m; ++i) for (j = 1; j <= n; ++j){ 19 if (map[i][j] != ‘@‘) continue; 20 now.y = i; now.x = j; 21 q.push(now); ++opt; map[now.y][now.x] = ‘*‘; 22 while (!q.empty()){ 23 now = q.front(); q.pop(); 24 for (k = 0; k < 16; k += 2){ 25 nxt.y = now.y + fx[k]; nxt.x = now.x + fx[k + 1]; 26 if (map[nxt.y][nxt.x] == ‘@‘){ q.push(nxt); map[nxt.y][nxt.x] = ‘*‘; } 27 } 28 } 29 } 30 printf("%d\n", opt); 31 } 32 return 0; 33 }
标签:otto c11 distinct 输入 blog 文件 enter 传感器 scanf
原文地址:http://www.cnblogs.com/Simon-X/p/6391963.html