- 个人微信公众号:
- 题意:给定一个三维的数组,由0和1组成,如果一个联通分量中1的个数大于t,则该联通分量满足条件,问三维数组中满足条件的联通分量中的1 的个数。
- 解法:
- dfs:利用递归来遍历所有满足条件的点
- bfs:利用queue来记录走过点的位置
- 本题使用dfs会出现段错误,因为递归次数太多了,所以我们使用bfs作为正确的解法
- 代码如下:
- bfs
int count_point_queue(bool matrix[max_m][max_n][max_l], bool used[max_m][max_n][max_l], int x, int y, int z, int m, int n, int l)
{
queue<Index> my_queue;
int res = 1;
used[x][y][z] = true;
Index index = Index(x, y, z);
my_queue.push(index);
while(my_queue.empty() == false)
{
Index cur_index = my_queue.front();
my_queue.pop();
for(int i=0;i<6;i++)
{
int cur_x = cur_index.x + dirs[i][0];
int cur_y = cur_index.y + dirs[i][1];
int cur_z = cur_index.z + dirs[i][2];
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l) && matrix[cur_x][cur_y][cur_z] == 1 && used[cur_x][cur_y][cur_z] == false)
{
used[cur_x][cur_y][cur_z] = true;
res += 1;
//cout<<cur_x<<" , "<<cur_y<<" , "<<cur_z<<" +++"<<endl;
Index new_index = Index(cur_x, cur_y, cur_z);
my_queue.push(new_index);
continue;
}else{
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l))
{
used[cur_x][cur_y][cur_z] = true;
}
}
}
}
return res;
}
- dfs
int count_point_dfs(bool matrix[max_m][max_n][max_l], bool used[max_m][max_n][max_l], int x, int y, int z, int m, int n, int l)
{
int res = 1;
used[x][y][z] = true;
for(int i=0;i<6;i++)
{
int cur_x = x + dirs[i][0];
int cur_y = y + dirs[i][1];
int cur_z = z + dirs[i][2];
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l) && matrix[cur_x][cur_y][cur_z] == 1 && used[cur_x][cur_y][cur_z] == false)
{
used[cur_x][cur_y][cur_z] = true;
//cout<<cur_x<<" , "<<cur_y<<" , "<<cur_z<<" +++"<<endl;
res += count_point(matrix, used, cur_x, cur_y, cur_z, m, n, l);
continue;
}else{
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l))
{
used[cur_x][cur_y][cur_z] = true;
}
}
}
return res;
}
完整代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int max_m = 130;
const int max_n = 130;
const int max_l = 70;
class Index{
public:
Index()
{
x = -1;
y = -1;
z = -1;
}
Index(int xx, int yy, int zz)
{
x = xx;
y = yy;
z = zz;
}
int x;
int y;
int z;
};
const int dirs[6][3] = {
{1, 0, 0},
{0, 1, 0},
{0, 0, 1},
{-1, 0, 0},
{0, -1, 0},
{0, 0, -1}
};
bool ok_x_y_z(int x, int y, int z, int m, int n, int l)
{
if(x<0 || x>=m)
{
return false;
}
if(y<0 || y >=n)
{
return false;
}
if(z<0 || z>=l)
{
return false;
}
return true;
}
int count_point_dfs(bool matrix[max_m][max_n][max_l], bool used[max_m][max_n][max_l], int x, int y, int z, int m, int n, int l)
{
int res = 1;
used[x][y][z] = true;
for(int i=0;i<6;i++)
{
int cur_x = x + dirs[i][0];
int cur_y = y + dirs[i][1];
int cur_z = z + dirs[i][2];
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l) && matrix[cur_x][cur_y][cur_z] == 1 && used[cur_x][cur_y][cur_z] == false)
{
used[cur_x][cur_y][cur_z] = true;
//cout<<cur_x<<" , "<<cur_y<<" , "<<cur_z<<" +++"<<endl;
res += count_point(matrix, used, cur_x, cur_y, cur_z, m, n, l);
continue;
}else{
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l))
{
used[cur_x][cur_y][cur_z] = true;
}
}
}
return res;
}
int count_point_queue(bool matrix[max_m][max_n][max_l], bool used[max_m][max_n][max_l], int x, int y, int z, int m, int n, int l)
{
queue<Index> my_queue;
int res = 1;
used[x][y][z] = true;
Index index = Index(x, y, z);
my_queue.push(index);
while(my_queue.empty() == false)
{
Index cur_index = my_queue.front();
my_queue.pop();
for(int i=0;i<6;i++)
{
int cur_x = cur_index.x + dirs[i][0];
int cur_y = cur_index.y + dirs[i][1];
int cur_z = cur_index.z + dirs[i][2];
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l) && matrix[cur_x][cur_y][cur_z] == 1 && used[cur_x][cur_y][cur_z] == false)
{
used[cur_x][cur_y][cur_z] = true;
res += 1;
//cout<<cur_x<<" , "<<cur_y<<" , "<<cur_z<<" +++"<<endl;
Index new_index = Index(cur_x, cur_y, cur_z);
my_queue.push(new_index);
continue;
}else{
if(ok_x_y_z(cur_x, cur_y, cur_z, m, n, l))
{
used[cur_x][cur_y][cur_z] = true;
}
}
}
}
return res;
}
int main()
{
freopen("/home/give/PAT/AcuteStroke.txt", "r", stdin);
int m,n,l;
int t;
cin>>m>>n>>l>>t;
bool matrix[max_m][max_n][max_l];
bool used[max_m][max_n][max_l];
memset(used, 0, sizeof(used));
for(int z=0;z<l;z++)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>matrix[i][j][z];
}
}
}
int res = 0;
for(int z=0;z<l;z++)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(used[i][j][z] == false && matrix[i][j][z] == 1)
{
used[i][j][z] = true;
int points = count_point_queue(matrix, used, i, j, z, m, n, l);
if(points >= t)
{
res += points;
}
}
}
}
}
cout<<res<<endl;
}