假设有一个类似于魔方的大正方体由n*n*n小块堆叠而成,使用图graph结构来存储。每小块为一个节点,值为0或1。现欲将正方体表面非0的节点抠掉,使得人眼所看到的小块值均为1。注意每抠掉一块,则人眼会看到新的表面。在新的表面继续将非0节点抠掉,直至人眼所见的小块的值均为1。有种情况可能会出现,即若沿某个方向一直抠下去全是0,即将立方体抠通了出现一个洞。请各位高手不吝赐教,给点思路也行。多谢。

解决方案 »

  1.   

    一、定义三维数组类型
    type
      TArr = array[0..19,0..19,0..19] of Byte; //  数据模型 20*20*20
      TArr1 = array[0..19,0..19] of Byte;       //  合并纵向通透模型二、定义全局数组变量
    var M:TArr;    // 数据模型          
        M1:TArr;   // 合并纵向通透三、初始化
    说明:三维数组X(横)Y(坚)Z(纵),循环变量i,j,k, 
    procedure TForm1.Button1Click(Sender: TObject);
    var i,j,k:integer;
    begin
      randomize;
      for k:=0 to 19 do
        for j:=0 to 19 do
          for i:=0 to 19 do
            M[i,j,k]:=random(2);  // 0-1随机数。
    end;四、搜索合并纵向通透
    var T:boolean;
       i,j,k,kk:integer; 
    begin
      kk:=5; // 合并1-6层
      for i:=0 to 19 do
        for i:=0 to 19 do
        begin
          T:=True;
          for k:=0 to kk do
          if [k,i,j]=1 then T:=False;
          if T then M1[i,j]:=0
               else M1[i,j]:=1;     
        end;
    end;五、显示图形 
    通过Memo字符图形,如果画图,自己写吧。
      

  2.   

    感谢兄台指教。恕愚昧,您给的程序是否是这个意思:M1是个二维数据,将其返回好像是把三维的M投影至平面M1上,若M有一列非1,则投影为1,若全为0,则投影为0。我需要的应该是稳态后将M全部表面为1的返回。我再表述一下我的意思:
    假设有一个类似于魔方的大正方体由n*n*n小块堆叠而成,使用图graph结构来存储。每小块为一个节点,值为0或1。现将该正方体完全浸入水中,水会将正方体表面非0的节点溶解掉,表面为1的保留下来。注意每溶解掉一块,则会出新的表面且接触到水,在新的表面继续将非0节点溶解,直至所有接触到水的小块的值均为1。有2种情况可能会出现,一是若沿某个方向一直溶解下去全是0,则立方体被打通出现一个洞;二是立方体有可能被溶解为多个断开不相连的物体。 程序结果返回剩余的所有表面为1的节点。
      

  3.   


    哥,感谢帮助,我觉得好像不是这个意思。节点溶解不单单是朝一个方向,而是朝3个坐标轴即上下前后左右6个方向(水从某一个方向溶进来后,就可以向剩余的5个方向继续溶解)。每当溶解掉内部一个节点,其周围的5个节点都接触了水,都有可能被溶解。有点类似于floodfill,或者遍历。另外,程序需要返回的是所有剩余的表面结点,貌似至少应该返回3维数组才能表示节点的坐标。非常感谢。