PAT甲级 1091 Acute Stroke (30 分)

\quad 很简单三维搜索,可以用BFS或者DFS。但是DFS好像会爆栈,有两个测试用例过不了。BFS程序如下:

#include <bits/stdc++.h>
using namespace std;

int I[1286][128][60];
int m, n, l, t;
int vis[1286][128][60];
int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
bool bound(int x, int y, int z)
{
	if(x>=0 && x<m && y>=0 && y<n && z>=0 && z<l) return true;
	return false;
}

struct Node
{
	int x, y, z, val;
};

int bfs(int x, int y, int z)
{
	int count = 0;
	queue<Node> q;
    Node node;
    node.x = x; node.y = y; node.z = z; node.val = I[x][y][z];
    vis[x][y][z] = 1;
    q.push(node);
    while(!q.empty())
    {
    	Node t = q.front();
    	q.pop();
    	count++;
    	for (int i = 0; i < 6; ++i)
    	{
    		Node t_next;
    		t_next.x = t.x+dir[i][0]; t_next.y = t.y+dir[i][1]; t_next.z = t.z+dir[i][2];
    		if(bound(t_next.x, t_next.y, t_next.z))
    		{
    			t_next.val = I[t_next.x][t_next.y][t_next.z];
    			if(vis[t_next.x][t_next.y][t_next.z]==0 && t_next.val==1) 
				{
					q.push(t_next);
					vis[t_next.x][t_next.y][t_next.z] = 1;
				}
    		}
    	}
    }
    return count; 
}

int main(int argc, char const *argv[])
{
	scanf("%d%d%d%d", &m ,&n, &l, &t);
	for (int i = 0; i < l; ++i)
	{
		for (int j = 0; j < m; ++j)
		{
			for (int k = 0; k < n; ++k)
			{
				scanf("%d", &I[j][k][i]);
			}
		}
	}
	int res = 0;
	for (int i = 0; i < l; ++i)
	{
		for (int j = 0; j < m; ++j)
		{
			for (int k = 0; k < n; ++k)
			{
				if(I[j][k][i]==1 && vis[j][k][i]==0)
				{
					int temp = bfs(j, k, i);
					if(temp>=t) res+=temp;
				}
			}
		}
	}
	printf("%d\n", res);
	return 0;
}

在这里插入图片描述
DFS程序如下:

#include <bits/stdc++.h>
using namespace std;

int I[1286][128][60];
int m, n, l, t;
int vis[1286][128][60];
int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
bool bound(int x, int y, int z)
{
	if(x>=0 && x<m && y>=0 && y<n && z>=0 && z<l) return true;
	return false;
}

struct Node
{
	int x, y, z, val;
};

vector<int> cnt;
void dfs(int x, int y, int z)
{
	cnt.push_back(1);
	vis[x][y][z] = 1;
	for (int i = 0; i < 6; ++i)
	{
		x += dir[i][0]; y += dir[i][1]; z += dir[i][2];
		if(bound(x, y, z) && vis[x][y][z]==0 && I[x][y][z]==1)
		{
			vis[x][y][z] = 1;
			dfs(x, y, z);
		}
	}
}

int main(int argc, char const *argv[])
{
	scanf("%d%d%d%d", &m ,&n, &l, &t);
	for (int i = 0; i < l; ++i)
	{
		for (int j = 0; j < m; ++j)
		{
			for (int k = 0; k < n; ++k)
			{
				scanf("%d", &I[j][k][i]);
			}
		}
	}
	int res = 0;
	for (int i = 0; i < l; ++i)
	{
		for (int j = 0; j < m; ++j)
		{
			for (int k = 0; k < n; ++k)
			{
				if(I[j][k][i]==1 && vis[j][k][i]==0)
				{
					cnt.clear();
					dfs(j, k, i);
					if(cnt.size()>=t) res+=cnt.size();
				}
			}
		}
	}
	printf("%d\n", res);
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40438165/article/details/89790755