计算水池数目

原题目链接:原题目

采用广度优先算法来做

为了简单起见,不从标准输入读取数据,数据在代码中指定

代码如下:

 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4 #define COLUMN_NUMBER 5
 5 #define ROW_NUMBER 5
 6
 7 int get_count(const int (*data)[COLUMN_NUMBER]);
 8
 9 struct Point {
10     int x;
11     int y;
12     Point(int x,int y)
13     {
14         this->x = x;
15         this->y = y;
16     }
17     Point(){}
18
19 };
20
21 int main()
22 {
23     int data[ROW_NUMBER][COLUMN_NUMBER] = {{1,1,1,1,0},
24                                           {0,0,1,0,1},
25                                           {0,0,0,0,0},
26                                           {1,1,1,0,0},
27                                           {0,0,1,1,1}};
28     int count = get_count(data);
29     cout << "count = " << count << endl;
30     return 0;
31 }
32
33
34 int get_count(const int (*data)[COLUMN_NUMBER])
35 {
36     int count = 0;
37     int is_travelled[ROW_NUMBER][COLUMN_NUMBER] = {0};
38
39     for(int i = 0;i < ROW_NUMBER;++i)
40     {
41         for(int j = 0;j < COLUMN_NUMBER;++j)
42         {
43             //if it is a pool and is has not been travelled
44             if(1 == data[i][j] && 0 == is_travelled[i][j])
45             {
46                 ++count;
47
48                 is_travelled[i][j] = 1;//make it been travelled
49                 list<Point> vec;
50                 Point p(i,j);
51                 vec.push_back(p);
52                 while(!vec.empty())
53                 {
54                     Point current_point = vec.front();//get the first element
55                     vec.erase(vec.begin());//delete the first element
56                     //get the four neighor coordinates
57                     int left_top_x = current_point.x == 0 ? 0 : current_point.x -1 ;
58                     int left_top_y = current_point.y == 0 ? 0 : current_point.y - 1;
59                     int right_bottom_x = current_point.x == ROW_NUMBER - 1 ? ROW_NUMBER - 1 : current_point.x + 1;
60                     int right_bottom_y = current_point.y == COLUMN_NUMBER - 1 ? COLUMN_NUMBER - 1 : current_point.y + 1;
61
62                     Point vertex[4];
63                     vertex[0] = Point(left_top_x,current_point.y);
64                     vertex[1] = Point(right_bottom_x,current_point.y);
65                     vertex[2] = Point(current_point.x,left_top_y);
66                     vertex[3] = Point(current_point.x,right_bottom_y);
67
68                     for(int i = 0; i < 4;++i)
69                     {
70                         Point _p = vertex[i];
71                         if(0 == is_travelled[_p.x][_p.y] && 1 == data[_p.x][_p.y])
72                             vec.push_back(_p);
73                         is_travelled[_p.x][_p.y] = 1;
74                     }
75                 }
76             }
77         }
78     }
79
80     return count;
81
82 }
时间: 2024-10-31 12:25:15

计算水池数目的相关文章

水池数目(nyoj27)(BFS)

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

ACM 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

nyoj 27水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

NYOJ27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池

深搜 ,广搜,队列 nyoj 27 水池数目

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水

水池数目 ----- 图中有几个 单块的区域

水池数目 时间限制: 3000ms内存限制: 128000KB 64位整型: Java 类名: 上一题 提交 运行结果 统计 讨论版 下一题 题目描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入

NYOJ 27 水池数目 【简单搜索】

链接:click here~~ 题意: 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个

nyoj27水池数目 (DFS)

题目27 题目信息 运行结果 本题排行 讨论区 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行

NYOJ27.水池数目-DFS求连通块

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池