本来想在晚上把连连看的棋盘生成部分完成了的,不过貌似做不到了

算法是每次随机填入一个元素,然后按顺序找到能和它连接的一个空格填入同一个元素(如果找不到就回溯),填下一个元素。
也就是说填入的位置中有一个随机数,另一个按有序表1..n生成,这个算法应该能保证解的可行性并能覆盖所有的情况吧(再把1..n元素的位置随机排一下应该能覆盖了)
每次在填数前先判断是否有无法被连接的空格,这个剪枝效果很好。

还想到一种算法,先随机排满,然后消去所有能够连接到的对子,剩下的随机交换位置,再次消去能够连接的对子,直到全部消去为止。貌似这个算法不错,复杂度应该是O(k*n*m),n,m为行列,k为平均每次为了消去对子所需的交换次数,和随机序列的好坏有关,速度应该相当快了。

细节方面有个判断对子是否连接的函数,这个函数我是通过三次“扩张”解决的,首先从其中一个位置出发,向四周扩张,直到碰到“障碍物”;第二次从上一次扩张到的每个点出发,再次向四周扩张;然后再做一次就行。然后就只要判断另外一个棋子是否在这个位置的“殖民地”上就行(呵呵,Thinking in Zerg,恩)。当然棋盘的周围还要有一圈无障碍的空间。

小结
1. tempMap = (int[][])(map.clone());
并不是把map[][]的所有元素赋值给tempMap,但是(tempMap == map)的结果又是false,很奇怪
后来只好用两重循环写了个
现在分析一下
tempMap -< reference[] -< int[][]
reference -< int[]
map[][]相当于一个指向int[]的reference数组,而clone的作用可能仅仅把每一个reference赋值给了tempMap,因此tempMap本身的reference并没有变,因此tempMap != map;但是改动了tempMap中的某个元素以后,由于reference[]指向的地址和map[][]的地址一样,因此map数组中的元素也会变动
不知道这么理解对不对

2. Java 里方法不能嵌套?比如
Board() {
void DFS(int step) {
}
}
这样貌似不可以?


posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1.30 Java notes

Posted on 2007-04-22 20:23 ZelluX 阅读(118) 评论(0)  编辑  收藏 所属分类: OOP
2007-01-30 23:59:59
只有注册用户登录后才能发表评论。


网站导航: