数据结构实验魔方阵源代码,亲测可用!短小精悍!

合集下载

魔方阵算法及C语言实现

魔方阵算法及C语言实现

魔方阵算法及C语言实现1 魔方阵概念魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。

魔方阵也称为幻方阵。

例如三阶魔方阵为:魔方阵有什么的规律呢?魔方阵分为奇幻方和偶幻方。

而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。

下面分别进行介绍。

2 奇魔方的算法2.1 奇魔方的规律与算法奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下:1.数字1位于方阵中的第一行中间一列;2.数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n;3.数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1;4.如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。

2.2 奇魔方算法的C语言实现1 #include <stdio.h> 2// Author: / 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;1112 col = (N-1)/2;13 row = 0;1415a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19if((i-1)%N == 0 )20 {21 row++;22 }23else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829// if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row<N;row++)36 {37for(col = 0;col < N; col ++)38{39 printf("%6d",a[row][col]);40 }41printf("\n");42 }43return0;44 }3 偶魔方的算法偶魔方的情况比较特殊,分为阶数n = 4 * m(m =1,2,3……)的情况和阶数n = 4 * m + 2(m = 1,2,3……)情况两种。

【数据结构算法】实验3 稀疏矩阵基本操作-顺序结构(附源代码)

【数据结构算法】实验3 稀疏矩阵基本操作-顺序结构(附源代码)

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验三稀疏矩阵的基本操作--用顺序存储结构实验成绩指导老师(签名)日期一.实验目的和要求1.了解稀疏矩阵的三元组线性表存储方法。

2.掌握稀疏矩阵采用顺序存储结构时基本操作的实现。

二. 实验内容1.编写稀疏矩阵采用顺序存储结构时基本操作的实现函数。

基本操作包括:①初始化稀疏矩阵;②输入稀疏矩阵;③输出稀疏矩阵;④稀疏矩阵的相加运算。

要求把稀疏矩阵的存储结构定义及基本操作实现函数存放在头文件SeqMatrix.h中,主函数main() 存放在主文件test7_1.cpp中,在主函数中通过调用SeqMatrix.h中的函数进行测试。

2.选做:编写稀疏矩阵的相乘运算实现函数,要求把该函数添加到头文件SeqMatrix.h中,并在主文件t est7_1.cpp中添加相应语句进行测试。

3.填写实验报告,实验报告文件取名为report3.doc。

4.上传实验报告文件report3.doc与源程序文件SeqMatrix.h及test7_1.cpp到Ftp服务器上你自己的文件夹下。

三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路函数:void InitMatrix(SMatrix &M)功能:初始化稀疏矩阵思路:将稀疏矩阵的行、列、元素个数均置为0函数:void InputMatrix(SMatrix &M, int m, int n)功能:输入稀疏矩阵思路:以行、列、值的方式输入稀疏矩阵的每个元素函数:void OutputMatrix(SMatrix M)功能:输出稀疏矩阵思路:以行、列、值的方式输出稀疏矩阵的每个元素函数:SMatrix Add(SMatrix M1, SMatrix M2)功能:稀疏矩阵的相加运算思路:遍历M1与M2,若两者的当前元素行列号相等则将值相加,形成新的元素加入结果矩阵M (若为0则忽略),若不相等则按行列号顺序将小的那个加入结果矩阵M函数:SMatrix Multiply(SMatrix M1, SMatrix M2) 功能:选作:稀疏矩阵的相乘运算思路:嵌套遍历M1与M2,当M1的当前元素列号与M2的当前元素行号相等时相乘两个数,并将结果暂存入单链表。

c++魔方最短还原算法

c++魔方最短还原算法

解决魔方(例如魔方、魔方2x2、4x4、5x5 等)的最短还原算法是一个复杂的问题,通常涉及到组合爬山、广度优先搜索(BFS)、启发式搜索等高级算法。

下面我将简要介绍一种基于广度优先搜索的常见方法,用于找到魔方的最短还原路径。

请注意,这是一个简单的示例,实际应用可能需要更复杂的算法和程序。

这里假设您正在处理标准的3x3魔方,并且您了解魔方的表示方法和操作符(例如R、L、U、D、F、B等),以及如何在编程中模拟这些操作。

1. **状态表示**:首先,您需要定义一个数据结构来表示魔方的状态。

通常,可以使用一个3x3的数组来表示魔方的每个小块的颜色和位置。

2. **初始状态和目标状态**:将初始魔方状态和目标还原状态定义为两个不同的状态。

3. **BFS搜索**:使用广度优先搜索(BFS)算法,从初始状态开始,在每个步骤中生成所有可能的下一步状态,并将它们加入到搜索队列中。

同时,记录每个状态所经过的步骤数。

重复这个过程,直到找到目标还原状态或搜索队列为空。

4. **剪枝**:为了加速搜索,可以使用一些启发式方法来剪枝,减少搜索空间。

例如,您可以计算每个状态到目标状态的估计步数(通常称为启发式函数),并在搜索中优先考虑具有更低估计步数的状态。

5. **路径记录**:一旦找到目标状态,可以回溯以找到从初始状态到目标状态的最短路径,这将是还原魔方的最短步骤序列。

请注意,这只是一个高层次的概述,实现一个完整的魔方最短还原算法需要详细的编程和算法设计。

此外,有许多现成的魔方求解器库和工具可供使用,这些工具已经实现了高效的算法,因此您可能不必从头开始构建自己的算法。

魔方程序C语言代码

魔方程序C语言代码

魔方程序C语言代码#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>//小方块的结构,包括小方块在x,y,z上的旋转角度,颜色数组下标,小方块的三维坐标。

struct rcube{int xr;int yr;int zr;int cl[6];GLfloat x;GLfloat y;GLfloat z;};struct rcube rc[3][3][3];struct rcube *temp[3][3];//颜色数组GLfloatcolor[6][3]={{1.0,0.0,0.0},{0.0,1.0,0.0}, {0.0,0.0,1.0},{1.0,1.0,0.0},{1.0,0.0,1.0},{0.0,1.0,1.0} };int tempc[3][3][6];//有关旋转的一些变量GLfloat xRot = 10.0f;GLfloat yRot = 10.0f;int rotateType=0;int rotateOK=0;int rotateRate=50;int rotate=0;///////////////////////////////////////// ////////////////////////////////////// //画小方块void drawcube(int cl[6]){glBegin(GL_QUADS);//右面glColor3fv(color[cl[0]]);glVertex3f(0.14f,-0.14f,-0.14f); glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);//左面glColor3fv(color[cl[1]]);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f); //前面glColor3fv(color[cl[2]]);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);//后面glColor3fv(color[cl[3]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f); //上面glColor3fv(color[cl[4]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,-0.14f);//下面glColor3fv(color[cl[5]]);glVertex3f(-0.14f,-0.14f,-0.14f); glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glEnd();glFlush();}//窗口刷新时被调用。

数据结构 魔方阵

数据结构 魔方阵

【完成题目2】魔方阵【问题描述】魔方阵是一个古老的智力问题,它要求在一个m*n的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:(a)三阶魔方阵(b)五阶魔方阵【基本要求】1.输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出提示信息;2.实现魔方阵;3.输出魔方阵。

【算法设计】首先,输入一个数字m(0<m<100),则输出对应的m阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。

若输入数字m超出要求范围或数字m为偶数或数字m<0,则提醒用户输入错误,需重新输入m。

使用多维数组输出魔方阵。

输入形式:数字m(0<m<100)。

输出形式:以矩阵形式输出n(0<m<100)阶奇数魔方阵;【源代码】#include <iostream>using namespace std;int main(int argc, char* argv[]){int i,j,m,k;//i:行,j:列,m:阶数,k:矩阵int a[100][100];cout<<"请输入一个奇数m (0<m<100):";loop1: cin>>m; //loop:循环if(m%2==0||m<0||m>=100){cout<<"输入错误!请重新输入一个奇数n (0<m<100):";goto loop1;}i=0;j=m/2;for(k=1;k<=m*m;k++){a[i][j]=k;if(k%m==0)i++;//行数加1else{i=(i==0)?m-1:i-1;j=(j==m-1)?0:j+1;}}for(i=0;i<m;i++){for(j=0;j<m;j++){cout<<a[i][j]<<" ";}cout<<endl;}return 0;}【结果截图】【收获及体会】本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。

魔方程序C语言代码

魔方程序C语言代码

#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>//小方块的结构,包括小方块在x,y,z上的旋转角度,颜色数组下标,小方块的三维坐标。

struct rcube{int xr;int yr;int zr;int cl[6];GLfloat x;GLfloat y;GLfloat z;};struct rcube rc[3][3][3];struct rcube *temp[3][3];//颜色数组GLfloat color[6][3]={{1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},{1.0,1.0,0.0},{1.0,0.0,1.0},{0.0,1.0,1.0}};int tempc[3][3][6];//有关旋转的一些变量GLfloat xRot = 10.0f;GLfloat yRot = 10.0f;int rotateType=0;int rotateOK=0;int rotateRate=50;int rotate=0;/////////////////////////////////////////////////////////////////////////////// //画小方块void drawcube(int cl[6]){glBegin(GL_QUADS);//右面glColor3fv(color[cl[0]]);glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);//左面glColor3fv(color[cl[1]]);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f);//前面glColor3fv(color[cl[2]]);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);//后面glColor3fv(color[cl[3]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(0.14f,0.14f,-0.14f);glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(-0.14f,-0.14f,-0.14f);//上面glColor3fv(color[cl[4]]);glVertex3f(-0.14f,0.14f,-0.14f);glVertex3f(-0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,0.14f);glVertex3f(0.14f,0.14f,-0.14f);//下面glColor3fv(color[cl[5]]);glVertex3f(-0.14f,-0.14f,-0.14f);glVertex3f(0.14f,-0.14f,-0.14f);glVertex3f(0.14f,-0.14f,0.14f);glVertex3f(-0.14f,-0.14f,0.14f);glEnd();glFlush();}//窗口刷新时被调用。

JAVA 3D 魔方源代码

JAVA 3D 魔方源代码

//存为MoFang.javaimport java.applet.Applet ;import java.awt.*;import com.sun.j3d.utils.applet.MainFrame ;import java.awt.BorderLayout ;import com.sun.j3d.utils.universe.SimpleUniverse ;import javax.media.j3d.*;import javax.vecmath.*;import com.sun.j3d.utils.behaviors.mouse.*;import com.sun.j3d.utils.behaviors.keyboard.*;import com.sun.j3d.utils.picking.behaviors.*;import com.sun.j3d.utils.geometry.*;import com.sun.j3d.utils.image.TextureLoader ;import javax.swing.*;import java.awt.*;import java.awt.event.*;import javax.swing.JFrame.*;import javax.swing.*;class mySimpleUniverse extends Applet{BranchGroup createSceneGraph(Canvas3D canvas){//System.out.print("**1**");//创建变换组,无用的t3DTransform3D t3d=new Transform3D();TransformGroup trans=new TransformGroup(t3d);trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);//创建分枝组BranchGroup objRoot=new BranchGroup();//测试//SomeShape3D.book3D( this, trans);SomeShape3D.addText3DDonghua(trans,"魔方",new Point3f(-7.0f,6.0f,6.0f),0.1f,new Color3f(1.0f,0.0f,0.0f),1);//初始化数据结构System.out.println("\n\n载入方块,并向变换组中加入每个方块的坐标系和方块...");for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){int[] p;p=Position.getPxyzFromPositionAy(i,j,k,MoFang.positionArray);MoFang.blockArray[i][j][k]=new Block(i,j,k,p[0],p[1],p[2],trans,t3d,objRoot,this);}System.out.println("加入每个方块的坐标系和方块,完成.\n");//创建大坐标轴,自动加到主坐标系SomeShape3D.zuoBiaoZhuBigXShape3D(trans);SomeShape3D.zuoBiaoZhuBigYShape3D(trans);SomeShape3D.zuoBiaoZhuBigZShape3D(trans);//创建边界对象BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100);//创建鼠标pick行为,加到分支组objRootPickRotateBehavior pickRotate=new PickRotateBehavior(objRoot,canvas,bounds);PickTranslateBehavior pickTranslate=new PickTranslateBehavior(objRoot,canvas,bounds);PickZoomBehavior pickZoom=new PickZoomBehavior(objRoot,canvas,bounds);//objRoot.addChild(pickRotate);objRoot.addChild(pickTranslate);//objRoot.addChild(pickZoom);//创建鼠标旋转行为MouseRotate behavior=new MouseRotate();behavior.setTransformGroup(trans);behavior.setSchedulingBounds(bounds);//创建鼠标平移行为//MouseTranslate myMouseRotate=new MouseTranslate();//myMouseRotate.setTransformGroup(trans);//myMouseRotate.setSchedulingBounds(bounds);//创建鼠标缩放行为MouseZoom myMouseZoom=new MouseZoom();myMouseZoom.setTransformGroup(trans);myMouseZoom.setSchedulingBounds(bounds);//创建键盘默认行为KeyNavigatorBehavior keyNavBeh=new KeyNavigatorBehavior(trans);keyNavBeh.setSchedulingBounds(bounds);objRoot.addChild(keyNavBeh);//白色背景Background bg=new Background(new Color3f(0.0f,0.0f,0.0f));bg.setApplicationBounds(bounds);objRoot.addChild(bg);//创建带材质的背景//TextureLoader bgTexture=new TextureLoader("bg3.jpg",this);//Background bg=new Background(bgTexture.getImage());//bg.setApplicationBounds(bounds);//trans.addChild(shape1);//3D物体加到变换组//trans.addChild(shape2);//3D物体加到变换组objRoot.addChild(trans);//变换组加到分枝组objRoot.addChild(behavior);//鼠标行为加到分枝组//objRoot.addChild(myMouseRotate);//objRoot.addChild(myMouseZoom);//objRoot.addChild(bg);//背景加到分枝组//编译pile();//回送创建好的带3D物体的分枝组return objRoot ;}mySimpleUniverse(){//创建带控制的画布GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();Canvas3D c=new Canvas3D(config);//创建以画布为依托的简单场景图对象,没有多个LocaleSimpleUniverse u=new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();//创建分支组对象BranchGroup scene=createSceneGraph(c);//组装,分支组对象加到场景图u.addBranchGraph(scene);//带场景图的画布加到本applet中setLayout(new BorderLayout());add("Center",c);}//测试码//public static void main(String aregs[])//{new MainFrame(new mySimpleUniverse(),200,200);//加applet到应用程序界面//}}class SomeShape3D{public static float zuoBiaoZhouSmallDingDian=0.09f;//小坐标顶点位置public static float zuoBiaoZhouSmallDingXi=0.02f;//小坐标顶点伞的半径public static float zuoBiaoZhouSmallDingChang=0.07f;//小坐标顶点伞的长度public static float zuoBiaoZhouSmallWeiDian=-0.09f;//小坐标尾巴的位置public static float zuoBiaoZhouBigDingDian=1.0f;//大坐标顶点位置public static float zuoBiaoZhouBigDingXi=0.04f;//大坐标顶点伞的半径public static float zuoBiaoZhouBigDingChang=0.8f;//大坐标顶点伞的长度public static float zuoBiaoZhouBigWeiDian=-1.0f;//大坐标尾巴的位置public static float fangKuaiBanJing=0.18f;//每个方块的半径public static void zuoBiaoZhuBigXShape3D(TransformGroup trans){//创建大坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;SomeShape3D.addText3DDonghua(trans,"X",newPoint3f(zuoBiaoZhouBigDingDian*10,0.0f,0.0f),0.1f,Block.mianColor[0],0);Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(zuoBiaoZhouBigDingDian,0.0f,0.0f);colors[i]=Block.mianColor[0];}else{z1=(float)(zuoBiaoZhouBigDingXi*Math.cos(i*2*Math.PI/25));x1=zuoBiaoZhouBigDingChang;y1=(float)(zuoBiaoZhouBigDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[0];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(zuoBiaoZhouBigDingDian,0.0f,0.0f);colors[27+i]=Block.mianColor[0];}else{z1=(float)(0.01f*Math.cos(i*2*Math.PI/12));x1=zuoBiaoZhouBigWeiDian ;y1=(float)(0.01f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[1];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes(); polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE); app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);System.out.print("zuoBiaoZhuBigX 创建完成\n");trans.addChild(shape);//到这里,大坐标轴对象创建完成}public static void zuoBiaoZhuBigYShape3D(TransformGroup trans){//创建大坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;SomeShape3D.addText3DDonghua(trans,"Y",newPoint3f(-1.0f,zuoBiaoZhouBigDingDian*10,0.0f),0.1f,Block.mianColor[2],0);Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(0.0f,zuoBiaoZhouBigDingDian,0.0f);colors[i]=Block.mianColor[2];}else{x1=(float)(zuoBiaoZhouBigDingXi*Math.cos(i*2*Math.PI/25));y1=zuoBiaoZhouBigDingChang;z1=(float)(zuoBiaoZhouBigDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[2];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(0.0f,zuoBiaoZhouBigDingDian,0.0f);colors[27+i]=Block.mianColor[2];}else{x1=(float)(0.01f*Math.cos(i*2*Math.PI/12));y1=zuoBiaoZhouBigWeiDian ;z1=(float)(0.01f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[3];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes();polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);System.out.print("zuoBiaoZhuBigY 创建完成\n");trans.addChild(shape);//到这里,大坐标轴对象创建完成}public static void zuoBiaoZhuBigZShape3D(TransformGroup trans) {//创建大坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;SomeShape3D.addText3DDonghua(trans,"Z",newPoint3f(-1.0f,0.0f,zuoBiaoZhouBigDingDian*10),0.1f,Block.mianColor[4],0);Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(0.0f,0.0f,zuoBiaoZhouBigDingDian);colors[i]=Block.mianColor[4];}else{y1=(float)(zuoBiaoZhouBigDingXi*Math.cos(i*2*Math.PI/25));z1=zuoBiaoZhouBigDingChang;x1=(float)(zuoBiaoZhouBigDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[4];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(0.0f,0.0f,zuoBiaoZhouBigDingDian);colors[27+i]=Block.mianColor[4];}else{y1=(float)(0.01f*Math.cos(i*2*Math.PI/12));z1=zuoBiaoZhouBigWeiDian ;x1=(float)(0.01f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[5];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes();polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);System.out.print("zuoBiaoZhuBigZ 创建完成\n");trans.addChild(shape);//到这里,大坐标轴对象创建完成}public static void zuoBiaoZhuSmallXShape3D(TransformGroup trans){//创建小坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(zuoBiaoZhouSmallDingDian,0.0f,0.0f);colors[i]=Block.mianColor[0];}else{z1=(float)(zuoBiaoZhouSmallDingXi*Math.cos(i*2*Math.PI/25));x1=zuoBiaoZhouSmallDingChang ;y1=(float)(zuoBiaoZhouSmallDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[0];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(zuoBiaoZhouSmallDingDian,0.0f,0.0f);colors[27+i]=Block.mianColor[0];}else{z1=(float)(0.005f*Math.cos(i*2*Math.PI/12));x1=zuoBiaoZhouSmallWeiDian ;y1=(float)(0.005f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[1];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes();polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE); app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);//System.out.print("zuoBiaoZhuSmallX 创建完成");trans.addChild(shape);//到这里,小坐标轴对象创建完成}public static void zuoBiaoZhuSmallYShape3D(TransformGroup trans){//创建小坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(0.0f,zuoBiaoZhouSmallDingDian,0.0f);colors[i]=Block.mianColor[2];}else{x1=(float)(zuoBiaoZhouSmallDingXi*Math.cos(i*2*Math.PI/25));y1=zuoBiaoZhouSmallDingChang ;z1=(float)(zuoBiaoZhouSmallDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[2];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(0.0f,zuoBiaoZhouSmallDingDian,0.0f);colors[27+i]=Block.mianColor[2];}else{x1=(float)(0.005f*Math.cos(i*2*Math.PI/12));y1=zuoBiaoZhouSmallWeiDian ;z1=(float)(0.005f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[3];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes();polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);//System.out.print("zuoBiaoZhuSmallY 创建完成");trans.addChild(shape);//到这里,小坐标轴对象创建完成}public static void zuoBiaoZhuSmallZShape3D(TransformGroup trans) {//创建小坐标轴对象int i ;float x1,x2,y1,y2,z1,z2 ;Point3f[]vert=new Point3f[41];Color3f[]colors=new Color3f[41];for(i=0;i<27;i++){if(i==0){vert[i]=new Point3f(0.0f,0.0f,zuoBiaoZhouSmallDingDian);colors[i]=Block.mianColor[4];}else{y1=(float)(zuoBiaoZhouSmallDingXi*Math.cos(i*2*Math.PI/25));z1=zuoBiaoZhouSmallDingChang ;x1=(float)(zuoBiaoZhouSmallDingXi*Math.sin(i*2*Math.PI/25));vert[i]=new Point3f(x1,y1,z1);colors[i]=Block.mianColor[4];}}for(i=0;i<14;i++){if(i==0){vert[27+i]=new Point3f(0.0f,0.0f,zuoBiaoZhouSmallDingDian);colors[27+i]=Block.mianColor[4];}else{y1=(float)(0.005f*Math.cos(i*2*Math.PI/12));z1=zuoBiaoZhouSmallWeiDian ;x1=(float)(0.005f*Math.sin(i*2*Math.PI/12));vert[27+i]=new Point3f(x1,y1,z1);colors[27+i]=Block.mianColor[5];}}int count[]=new int[2];count[0]=27 ;count[1]=14 ;TriangleFanArray tri=new TriangleFanArray(vert.length,TriangleFanArray.COORDINATES|TriangleStripArray.COLOR_3,count);tri.setCoordinates(0,vert);tri.setColors(0,colors);Appearance app=new Appearance();PolygonAttributes polyAttrib=new PolygonAttributes();polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);//polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);app.setPolygonAttributes(polyAttrib);Shape3D shape=new Shape3D(tri,app);//System.out.print("zuoBiaoZhuSmallZ 创建完成");trans.addChild(shape);//到这里,小坐标轴对象创建完成}public static Shape3D shapeMaker(Component observer,String filename,Point3f[] p){//用材质,四顶点数组创建一个四边面,需要applet对象observer//创建贴图和外观TextureLoader loader=new TextureLoader(filename,observer);ImageComponent2D myImage=loader.getImage();Texture myTex=loader.getTexture();myTex.setImage(0,myImage);Appearance appear=new Appearance();appear.setTexture(myTex);//四边形对象//QuadArray tri=new QuadArray(dingdian.length,QuadArray.COORDINATES|QuadArray.COLOR_3|QuadArray.TEXTURE_ COORDINATE_2);QuadArray tri=newQuadArray(4,QuadArray.COORDINATES|QuadArray.TEXTURE_COORDINATE_2);//GeometryArray tri.setCoordinates(0,p);//tri.setColors(0,color);//给四边形对象配材质TexCoord2f texCoords=new TexCoord2f();//材质坐标texCoords.set(0.0f,1.0f);//取左下角tri.setTextureCoordinate(0,0,texCoords);//为左上角texCoords.set(0.0f,0.0f);//tri.setTextureCoordinate(0,1,texCoords);//texCoords.set(1.0f,0.0f);//tri.setTextureCoordinate(0,2,texCoords);//texCoords.set(1.0f,1.0f);//tri.setTextureCoordinate(0,3,texCoords);//Shape3D shape=new Shape3D(tri,appear);return shape ;//到这里,6个面对象创建完成}public static void addText3DDonghua(TransformGroup parentTrg,String textString,Point3f myPoint3f,float sl,Color3f ambientColor,int donghua){//s1定scale,myPoint3f定位置,daxiao是大小//字的左下角默认左下角在中点,当tl=0.1时,要向左移10才到左端//自定义trgTransform3D trgtra=new Transform3D();TransformGroup trg=new TransformGroup(trgtra);trg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);trg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);//trg.setCapability(TransformGroup.ENABLE_PICK_REPORTING);double tessellation=-0.0 ;String fontName="vadana" ;// Create the root of the branch graph// Create a Transformgroup to scale all objects so they// appear in the scene.TransformGroup objScale=new TransformGroup();Transform3D t3d=new Transform3D();// Assuming uniform size chars, set scale to fit string in viewt3d.setScale(sl);objScale.setTransform(t3d);trg.addChild(objScale);// Create the transform group node and initialize it to the// identity. Enable the TRANSFORM_WRITE capability so that// our behavior code can modify it at runtime. Add it to the// root of the subgraph.TransformGroup objTrans=new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);objScale.addChild(objTrans);Font3D f3d ;if(tessellation>0.0){f3d=new Font3D(new Font(fontName,Font.PLAIN,2),tessellation,new FontExtrusion());}else{f3d=new Font3D(new Font(fontName,Font.PLAIN,2),new FontExtrusion());}Text3D txt=new Text3D(f3d,textString,myPoint3f);Shape3D sh=new Shape3D();Appearance app=new Appearance();Material mm=new Material();mm.setLightingEnable(true);app.setMaterial(mm);sh.setGeometry(txt);sh.setAppearance(app);objTrans.addChild(sh);BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);// Set up the ambient lightAmbientLight ambientLightNode=new AmbientLight(ambientColor); ambientLightNode.setInfluencingBounds(bounds);trg.addChild(ambientLightNode);// Set up the directional lightsColor3f light1Color=new Color3f(1.0f,1.0f,0.9f);Vector3f light1Direction=new Vector3f(1.0f,1.0f,1.0f);Color3f light2Color=new Color3f(1.0f,1.0f,0.9f);Vector3f light2Direction=new Vector3f(-1.0f,-1.0f,-1.0f);DirectionalLight light1=new DirectionalLight(light1Color,light1Direction);light1.setInfluencingBounds(bounds);trg.addChild(light1);DirectionalLight light2=new DirectionalLight(light2Color,light2Direction);light2.setInfluencingBounds(bounds);trg.addChild(light2);if(donghua==1){//给trg(自定义),加上旋转插件Alpha alpha1=new Alpha(-1,Alpha.INCREASING_ENABLE|Alpha.DECREASING_ENABLE,0,0,5000,300,100000,5000,30 0,100000);RotationInterpolator myRoTate=new RotationInterpolator(alpha1,trg,trgtra,0.0f,(float)Math.PI*30);myRoTate.setSchedulingBounds(bounds);trg.addChild(myRoTate);trgtra.rotZ(Math.PI/2);trg.setTransform(trgtra);System.out.println("\n文本动画方案:"+donghua);}parentTrg.addChild(trg);}}//由于java数组的局限,整个程序使用0,1,2空间,为了方便计算,计算时要进行坐标变换public class MoFang{//该类含魔方的数据表示,blockArray为计算单步必需的,Position为便于人的视觉(用于操作和//显示输出)而添加的辅助结构,实际上,我们可以总是从blockArray算出来,但计算量大得惊人public static Block[][][]blockArray=new Block[3][3][3];//设魔方27块public static Position[][][]positionArray=new Position[3][3][3];//魔方27个绝对位置//用于处理对魔方的操作,共27种操作//doType:'X','Y','Z'//Floor:-1,0,1//totateArg:90 180 -90public static void doIt(char doType,int Floor,int totateArg){System.out.println("\n处理操作:"+doType);System.out.println("层数:"+(Floor-1));System.out.println("角度:"+totateArg+"\n");if(!Block.closeDonghua) //动画打开才等待{while(Block.yunXingThread!=0){System.out.print('.');}}switch(doType){case 'Z' :for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)//for(int k=0;k<=2;k++){if(Block.closeDonghua)//动画关闭才变换中间块{if(i==1&&j==1){continue ;}}int changBlockX=positionArray[i][j][Floor].x ;int changBlockY=positionArray[i][j][Floor].y ;int changBlockZ=positionArray[i][j][Floor].z ;Block changBlock=blockArray[changBlockX][changBlockY][changBlockZ];changBlock.xyzChange('Z',totateArg);}break ;case 'Y' :for(int i=0;i<=2;i++)//for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){if(Block.closeDonghua){if(i==1&&k==1){continue ;}}int changBlockX=positionArray[i][Floor][k].x ;int changBlockY=positionArray[i][Floor][k].y ;int changBlockZ=positionArray[i][Floor][k].z ;Block changBlock=blockArray[changBlockX][changBlockY][changBlockZ];changBlock.xyzChange('Y',totateArg);}break ;case 'X' ://for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){if(Block.closeDonghua){if(j==1&&k==1){continue ;}}int changBlockX=positionArray[Floor][j][k].x ;int changBlockY=positionArray[Floor][j][k].y ;int changBlockZ=positionArray[Floor][j][k].z ;Block changBlock=blockArray[changBlockX][changBlockY][changBlockZ];changBlock.xyzChange('X',totateArg);}break ;default :System.out.println("无效的操作");}someBlockNewToOld();}//开始人工智能计算解法//select:选择电脑的计算方案public static void autoStart(int select){}//输出每个位置上的块号public static void showPosition(){System.out.println("\n每个位置上的块号:");for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){//System.out.println("Block"+i+","+j+","+k+""+blockArray[i][j][k].x+","+blockArray[i][j][k].y+","+blockArray[i][j][k].z);System.out.println("Position:"+(i-1)+","+(j-1)+","+(k-1)+" 的块号是:"+(positionArray[i][j][k].x-1)+","+(positionArray[i][j][k].y-1)+","+(positionArray[i][j][k].z-1));}}//把刚才记录的有变化(来了新的块)的位置存储到没个position的块号中public static void someBlockNewToOld(){for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){if(positionArray[i][j][k].haveNew){positionArray[i][j][k].newToOld();}}}public static void myWait(){try{System.in.read();System.in.read();//暂停}catch(Exception e){}}//测试用代码public static void someTest(){doIt('Y',0+1,90);// //new MoFang().showPosition();MoFang.myWait();doIt('Y',0+1,-90);MoFang.myWait();// new MoFang().showPosition();doIt('Z',-1+1,-90);//new MoFang().showPosition();MoFang.myWait();doIt('Z',-1+1,90);// new MoFang().showPosition();//MoFang.myWait();//new MoFang().showPosition();doIt('X',1+1,90);MoFang.myWait();//new MoFang().showPosition();doIt('X',1+1,-90);// new MoFang().showPosition();MoFang.myWait();//showPosition();}//魔方自动随机变化多少条public static void ranGet(int num){char selectChar='E';//'X','Y','Z'int layer;//-1,0,1int jiaoDu=0;//90,-19,180for(int i=0;i<num;i++){//选xyzint select=(int)((Math.random()*10)%3);if(select==0){selectChar='X';}if(select==1){selectChar='Y';}if(select==2){selectChar='Z';}//layer=(int)((Math.random()*10)%3);//0,1,2layer-=1;//-1,0,1//int jiao=(int)((Math.random()*10)%3);//0,1,2if(jiao==0){jiaoDu=90;}if(jiao==1){jiaoDu=-90;}if(jiao==2){jiaoDu=180-90;}System.out.println("\n*******************************\nRandom Generater:"+(i+1)+" of "+num);System.out.print(selectChar);System.out.print(","+layer+","+jiaoDu+"\n按任意键开始动画?\n");myWait();doIt(selectChar,layer+1,jiaoDu);}}//从三维图形界面输入操作参数public static void graphicStart(){JFrame myframe =new JFrame();myframe.setVisible(true);}public static void main(String[]args){//初始化位置数组,也可以从文件中加载,其实应该把所有关键信息从文件载入,关闭时保存for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)for(int k=0;k<=2;k++){MoFang.positionArray[i][j][k]=new Position(i,j,k);}System.out.println("初始化位置数组完成.最初全在原位置\n");//showPosition();new MainFrame(new mySimpleUniverse(),200,200);//加applet到应用程序界面//someTest();//graphicStart();myWait();ranGet(30);////}}class Block implements Runnable{//计算已画的块数private static int whickBlockPainted=0 ;//计算生成的第几块private static int BlockCreated=0 ;//每面的颜色,排列为:+x,-x,+y,-y,+z,-z,nopublic static Color3f[] mianColor={new Color3f(1.0f,0.0f,0.0f),new Color3f(0.0f,1.0f,0.0f),new Color3f(0.0f,0.0f,1.0f),new Color3f(1.0f,1.0f,0.0f),new Color3f(1.0f,0.0f,1.0f),new Color3f(0.0f,1.0f,1.0f),new Color3f(0.2f,0.2f,0.2f)};//每面的材质,排列为:+x,-x,+y,-y,+z,-z,nopublic static String[] mianImageFile=new String[7];//块偏移量private static float kuaiZhongXinWeizhi=0.4f ;//创建材质时要用的,仅用于他,他是一个applet对象Component observer;//该块的编号private int blockIdX ;private int blockIdY ;private int blockIdZ ;//该块的位置private int x ;private int y ;private int z ;//该块的坐标轴点,最初全为(1,1,1),表示与外坐标一致private MyPoint xvec;private MyPoint yvec;private MyPoint zvec;//position=new Verctor3f(0.0f,0.0f,0.0f);//该块的角度,限定为从-359到359,模360可以限定为一周,如果模180,则只能表示半个圆,不行//int anglex ;//int angley ;//int anglez ;//添加物品的变换组public TransformGroup transGroup ;public Transform3D trans ;//用于位置,角度变动的变换组public TransformGroup transGroupx ;public Transform3D transx ;public TransformGroup transGroupy ;public Transform3D transy ;public TransformGroup transGroupz ;public Transform3D transz ;public TransformGroup transGroupp ;public Transform3D transp ;//新的方块位置int[] nexyz={0,0,0};//动画相关int totateArg;boolean canNew=false;char selectedC;Thread myThread;public static boolean closeDonghua=false ; //为true使用线程动画,为false直接调用private static int selectDonghuaId=0;//取ID变量,取值从0~8,每次从0开始取,正好9个,取完后变为10(每取一个自动加1),这时才让所有线程一起动private int myDonghuaId;private static int donghuaDelay=50 ; //绝对延迟,public static int whileDelay=20;//加快同步系统性能延迟,//公共控制变量public static int yunXingThread=0;//运行的线程数,启动线程时加1,退出时减一。

奇数阶魔方算法及实现方法+数据结构

奇数阶魔方算法及实现方法+数据结构

课程设计封面题目:奇数阶魔方的算法与实现课程:数据结构学院:信息工程学院专业:物联网工程班级:12普本物联网学号:1201141009姓名:李冰洋指导教师:叶茂功任务书书写说明:1完成期限:自2014 年6 月5 日至2014 年6 月18 日共2 周2. 计划答辩时间:2014年 6 月22 日黄河科技学院本科课程设计任务书信息工程学院计算机科学系物联网工程专业2008 级12普本物联网班学生李冰洋学号1201141009 指导教师叶茂功课程名称:数据结构完成期限:自2014 年6 月 5 日至2014 年 6 月18 日共 2 周课程设计题目奇数阶魔方的算法与实现课程设计内容与基本要求一、内容本次课程设计内容主要是利用二维数组输出正确的n阶魔方矩阵。

二、要求(1)通过实际项目的分析、设计、编码、测试等工作,掌握用C语言来开发和维护软件。

(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户三、参考文献1.王红梅.数据结构.清华大学出版社2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社4.叶茂功,代文征.数据结构项目化教程.国防工业出版社四、注意事项1.提交课程设计代码与课程设计说明书;2.材料的书写符合《黄河科技学院毕业设计指导规范手册》。

计划答辩时间:2014 年 6 月31 日专业(教研室)审批意见:审批人(签字):目录1摘要 (1)2课程设计目的 (2)3课程设计内容 (2)4程序执行流程图 (3)5程序源代码 (4)6运行结果 (9)7结束语.............................................。

(11)摘要VC++6.0是一种基于C语言的数据库设计、创建和管理的软件,利用它可以对各种事务管理工作中的大量数据进行有效的管理并满足数据检索的需要。

本系统就是根据现阶段的需要,通过VC++6.0开发一个员工管理系统来实现对员工的信息的查找、高效的管理和维护。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档