祝兄弟姐妹节日快乐。顺便请教个问题。

yukuang 2015-10-01 10:06:09


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

请各位高手不吝赐教,给点思路也行。

多谢。
...全文
127 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yukuang 2015-10-09
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
对数组随机产生(0,1)。 合并各层上节点的值,如果全是0,等于0(通),只要有一个1,等于1(不通)。这就表达了你的节点溶解。 关键是找到数据模型。
哥,感谢帮助,我觉得好像不是这个意思。节点溶解不单单是朝一个方向,而是朝3个坐标轴即上下前后左右6个方向(水从某一个方向溶进来后,就可以向剩余的5个方向继续溶解)。每当溶解掉内部一个节点,其周围的5个节点都接触了水,都有可能被溶解。有点类似于floodfill,或者遍历。 另外,程序需要返回的是所有剩余的表面结点,貌似至少应该返回3维数组才能表示节点的坐标。 非常感谢。
lyhoo163 2015-10-09
  • 打赏
  • 举报
回复
对数组随机产生(0,1)。
合并各层上节点的值,如果全是0,等于0(通),只要有一个1,等于1(不通)。这就表达了你的节点溶解。
关键是找到数据模型。
编写一个程序模拟,见下图:

提示:模拟20*20*20矩阵, 随机填数(0,1),合并5层的情况,合并>9,就没有0(不透明了)。
lyhoo163 2015-10-09
  • 打赏
  • 举报
回复
终于表述清楚了。
林石公 2015-10-08
  • 打赏
  • 举报
回复
看起来很NB的样子,算法的不懂,静等
yukuang 2015-10-08
  • 打赏
  • 举报
回复
引用 1 楼 lyhoo163 的回复:
一、定义三维数组类型 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字符图形,如果画图,自己写吧。
感谢兄台指教。恕愚昧,您给的程序是否是这个意思:M1是个二维数据,将其返回好像是把三维的M投影至平面M1上,若M有一列非1,则投影为1,若全为0,则投影为0。 我需要的应该是稳态后将M全部表面为1的返回。我再表述一下我的意思: 假设有一个类似于魔方的大正方体由n*n*n小块堆叠而成,使用图graph结构来存储。每小块为一个节点,值为0或1。现将该正方体完全浸入水中,水会将正方体表面非0的节点溶解掉,表面为1的保留下来。注意每溶解掉一块,则会出新的表面且接触到水,在新的表面继续将非0节点溶解,直至所有接触到水的小块的值均为1。有2种情况可能会出现,一是若沿某个方向一直溶解下去全是0,则立方体被打通出现一个洞;二是立方体有可能被溶解为多个断开不相连的物体。 程序结果返回剩余的所有表面为1的节点。
lyhoo163 2015-10-02
  • 打赏
  • 举报
回复
一、定义三维数组类型 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字符图形,如果画图,自己写吧。

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧