`

UVA Tower of Cubes(10051)

 
阅读更多

题目大意:

       有N个立方体,立方体的6个面颜色不一,现在要求立方体按照体重从小到大叠起来,并且两个立方体接触面的颜色必须相同,求最高能叠多高?

 

解题思路:

       动态规划,本质上就是求最长递增子序列,同时加上了限制条件,就是两个立方体之间颜色要一样,所以我就先用动态规划求出最长符合要求的子序列的长度,同时记录序列最后一个元素的位置,然后再用递归输出子序列。最长递增子序列的状态转移方程就不写了,直接看代码里面就有,就那么一行,主要就是在状态转移的时候加上判断条件,判断颜色是否一样,然后记录子序列最后一个元素用来递归用。递归的时候也一样,先要判断颜色。

 

代码:

#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

vector<int> temp;
vector< vector<int> > v;
int dp[510][6];
char director[6][7]={"front", "back", "left", "right", "top", "bottom"};

void printPath(int ans, int pos, int posK)
{
	if( ans <= 0 )
	{
		cout<<pos+1<<" "<<director[posK]<<endl;
		return ;
	}

	for( int j = pos-1; j >= 0; j-- )
	{
		for( int k = 0; k < 6; k++ )
		{
			if( v[pos][posK] == v[j][k] && dp[j][k%2?k-1:k+1]+1 == ans && ans >= 0  )
			{
				ans--;
				printPath( ans, j, k%2?k-1:k+1 );
				cout<<pos+1<<" "<<director[posK]<<endl;
				return;
			}
		}
	}
	return;
}

int main()
{
	freopen("test.txt", "r", stdin );

	int N, color;
	int T = 1;
	while( cin>>N, N )
	{
		memset( dp, 0, sizeof( dp ) );
		memset( path, -1, sizeof( path ) );
		for( int i = 0; i < N; i++ )
		{
			for( int j = 0; j < 6; j++ )
			{
				cin>>color;
				temp.push_back(color);
			}
			v.push_back(temp);
			temp.clear();
		}
		int ans = 0, pos, posK, tempH = 0; 
		for( int i = 1; i < N; i++ )
		{
			for( int j = 0; j < i; j++ )
			{
				for( int k = 0; k < 6; k++ )
				{					
					for( int h = 0; h < 6; h++ )
					{
						tempH = h%2?h-1:h+1;   //求出h面的另一面
						if( v[i][k] == v[j][h] )
						{
							dp[i][k] = max(dp[j][tempH]+1,dp[i][k]);								
							if( dp[i][k] > ans )
							{
								ans = dp[i][k];
								pos = i;  //记录最后一个立方体的位置
								posK = k;//记录最后一个立方体朝上的那个面
							}
						}
					}
				}
			}
		}
		
		int test = 1;
		cout<<"Case #"<<T<<endl<<ans+1<<endl;

		printPath(ans, pos, posK);

		cout<<endl;
		v.clear();
		T++;
	}

	return 0;
}

 

分享到:
评论

相关推荐

    matlab如何调用marchingcubes算法

    在探讨MATLAB如何调用Marching Cubes算法之前,我们首先要了解Marching Cubes算法是什么。该算法是一种广泛应用于科学计算可视化领域的三维数据场等值面提取技术。其核心思想是通过移动一个立方体网格,遍历整个体...

    MarchingCubes-main_MarchingCubes_

    《Marching Cubes:一种三维体数据表面提取算法》 Marching Cubes(简称MC)是一种广泛应用于计算机图形学中的算法,主要用于从三维体数据中生成等值面,即找到数据集中特定值(如密度、温度等)的边界表面。在医学...

    marching_cubes_jgt

    《marching_cubes_jgt》是一个关于三维图形处理的重要算法——Marching Cubes(行进立方体)的详细研究和实现。在计算机图形学领域,Marching Cubes算法被广泛用于从三维体数据中生成二维的等值面,即通过三维空间中...

    marchingCubes.zip_CUDA MATLAB_DEMO_MarchingCubes_cubes_marching

    《MATLAB中的Marching Cubes算法与CUDA GPU优化实践》 Marching Cubes算法是一种用于三维数据体渲染的常用方法,特别是在医学成像、地质建模等领域广泛应用。它通过将三维网格划分为小的立方体(cubes)并判断每个...

    Marching Cubes:

    "Marching Cubes"是一种广泛应用于计算机图形学和科学可视化领域的算法,用于构建高分辨率的三维表面模型。这个算法的核心是将三维空间划分为一系列的小立方体,也称为体素,然后通过分析每个立方体内数据的分布来...

    Marching Cubes

    例如,"Efficient implementation of Marching Cubes' cases with topological guarantees.pdf"可能详细讨论了如何确保算法在所有情况下都能正确地保持拓扑结构。 体素(Voxel)是体数据的基础单位,等值面技术在...

    united_cubes_of_america

    united_cubes_of_america

    Marching Cubes面绘制

    - 性能优化:对于大型数据集,Marching Cubes可能会有性能问题,可以通过减少采样率、使用LOD(Level of Detail)技术等方法提高效率。 - 反射与透明度:调整材质属性,可以模拟物体的反射和透明效果,增加真实感。 ...

    marching cubes算法

    《深入理解Marching Cubes算法:三维重建的核心技术》 在计算机图形学领域,Marching Cubes(简称MC)算法是一项重要的三维表面重建技术,尤其在医学成像、地质勘探、游戏开发等领域中有着广泛的应用。该算法通过将...

    marching cubes MC算法详解

    三维重建算法marching cubes,简称MC算法 的详细解释,比较易懂

    Marching Cubes Module

    Marching Cubes(简称MC)是一种三维图形渲染算法,主要用于从体素数据中生成三角形网格,从而可视化连续的、基于体素的三维数据集,如医学扫描图像、流体动力学模拟结果或者游戏中的地形生成。在计算机图形学领域,...

    marchingcubes

    "marching cubes"是一种在计算机图形学中广泛使用的算法,用于将三维体数据集转换为三角网格表面,以便进行3D渲染和可视化。这个算法的核心是解决如何在体素(三维像素)空间中生成平滑的等值面,特别是在医学成像、...

    Marching_Cubes算法原理

    "Marching_Cubes算法原理" Marching Cubes 算法是面显示算法中的经典算法,也被称为“等值面提取”(Iso-surface Extraction)。本质是将一系列两维的切片数据看作是一个三维的数据场,从中将具有某种域值的物质...

    marching_cubes算法的C++实现.

    **marching_cubes(Marching Cubes)算法**是一种在计算几何中广泛使用的体绘制方法,主要用于从三维数据集(如医学扫描、流体模拟或3D建模)中生成三维表面网格。这个算法的核心思想是通过遍历数据体内的三维网格...

    matlab开发-MarchingCubes

    在MATLAB环境中,Marching Cubes(行进立方体)是一种常用的方法,用于从三维数据集(通常是医学图像或3D模拟结果)中提取等值面。这个算法的核心是将三维空间划分为一个立方体网格,并通过判断每个立方体内部等值线...

    球体的Marching Cubes实现

    Marching Cubes(简称MC)是一种广泛应用于计算机图形学中的三维体绘制算法,主要用于将三维体积数据集转化为网格表面,以便于进行可视化。这个算法尤其在科学计算可视化领域有着重要的应用,如生物医学成像、地质...

    Marching Cubes算法

    **Marching Cubes算法**是一种经典的三维数据场等值面生成方法,广泛应用于医学图像处理,如CT和MRI扫描图像的三维重建。等值面是数据场中所有具有相同值的点的集合,它可以通过数学表达式F(f)=c来表示,其中f是空间...

    运输行业PPT模板united_cubes_of_america004

    运输行业PPT模板united_cubes_of_america004

    marching cubes

    简单易懂讲解Marching Cubes算法,基于OpenGL,可以显示三维的标量场,动画讲解,可以直接复制到VS直接运行。

Global site tag (gtag.js) - Google Analytics