三维扫描(射雕英雄外传(第一幕)【SGOI-9】)

题目描述

  话说郭靖和黄蓉在美丽的桃花岛无忧无虑地生活着,花团锦簇,与岛上居民和睦相处,其乐融融!
  风云突变,蒙古大军入侵中原,"国家兴亡,匹夫有责",何况是抱有强烈正义感和爱国精神的郭靖夫妇。他们决定择日动身,前往边关,保家卫国。
  情真真,意切切,桃花岛的人们和郭靖夫妇是多么难舍难分!因此,他们决定来举行一次晚会,为郭靖夫妇饯行。
  郭靖说:"如果你能来参加我们的晚会,并能圆满地完成整个活动,我将会送给你一件精美的礼物!"。不是郭靖的降龙十八掌的套路和黄蓉的打狗棒法吧?太好了,要是我能得到,嘿嘿,我一定能成为……
  消息传出,参与者众!有真诚送别的岛上居民,但其中也不乏破坏晚会的敌特分子!

第一幕
  为了安全起见,郭靖夫妇租借了一台三维扫描仪器。利用它可以对三维物体(例如大脑)进行扫描,每个参加晚会的人都得经过扫描仪进行识别,其目的就是想通过该扫描仪来分析哪些人带了危险物品(比如炸药和危险兵器)。
  扫描仪将扫描的结果用一个三维的数组来保存,数组的每一个元素表示空间的一个象素。数组的元素是0-255的整数,表示该象素的灰度。例如0表示该象素是黑色的,255表示该象素是白色的。
  被扫描的物体往往是由若干个部件组合而成的。在实际问题中,同一个部件内部的色彩变化相对连续,而不同的部件的交界处色彩往往有突变。同一个部件内部,相邻两个象素的灰度差不超过正整数M(说明:每一个象素与前后、左右、上下的6个象素相邻)。M决定了程序识别部件的灵敏度。

任务
  你必须提供一个scan.exe的可执行程序,对于给定的物体,运行该程序,即刻就可以判断该物体是由几个部件组成的。

输入输出格式

输入格式:

  在输入的文本文件scan.in中的第一行是三个正整数L,W,H(L,W,H<=50),表示物体的长、宽、高。第二行是一个整数M(0<=M<=255),表示识别部件的灵敏度。
  接下来是L×W×H个0-255的非负整数,按照空间坐标从小到大的顺序依次给出每个象素的灰度。
  说明:对于空间两点P1(x1,y1,z1)和P2(x2,y2,z2),P1  (x1  (x1=x2且y1  (x1=x2且y1=y2且z1

输出格式:

  在输出的文本文件scan.out中只有一个整数N,表示一共识别出几个部件。

输入输出样例

输入样例#1:

2 2 2
0
1 1 1 1 2 2 2 2 

输出样例#1:

2

提示信息

分析:这题显然是求连通块个数,

只是在精度问题上要做一点小小的改动,dfs和bfs都可以,只是要把维度做成三维的(模板题)

直接上代码

​
#include
using namespace std;	
int L,W,H,M;
int ma[257][257][257],the[257][257][257],ans=0;
int dx[7]={0,-1,1,0,0,0,0};
int dy[7]={0,0,0,-1,1,0,0};
int dz[7]={0,0,0,0,0,-1,1};
void dfs(int x,int y,int z)
{
	for(int i=1;i<=6;i++)
	{
		int xx=x+dx[i];
		int yy=y+dy[i];
		int zz=z+dz[i];
		if(xx<1||yy<1||zz<1||xx>L||yy>W||zz>H) continue;
		if((abs(ma[xx][yy][zz]-ma[x][y][z])>M)||the[xx][yy][zz]==1)continue;
		the[xx][yy][zz]=1;
		dfs(xx,yy,zz);
	}
}
int main()
{
	cin>>L>>W>>H>>M;
	for(int i=1;i<=L;i++)
	{
		for(int j=1;j<=W;j++)
		{
			for(int k=1;k<=H;k++)
			{
				cin>>ma[i][j][k];
			}
		}
	}
	for(int i=1;i<=L;i++)
	{
		for(int j=1;j<=W;j++)
		{
			for(int k=1;k<=H;k++)
			{
				if(the[i][j][k]==0)
				{
					the[i][j][k]=1;
					dfs(i,j,k);
					ans++;
				}
			}
		}
	}
	cout<

你可能感兴趣的:(广搜,深搜,算法)