惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Announcements
Recent Announcements
IT之家
IT之家
Google DeepMind News
Google DeepMind News
罗磊的独立博客
爱范儿
爱范儿
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
U
Unit 42
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
B
Blog
博客园 - 叶小钗
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 空空色色

转一篇,CentOS后台服务配置 linux kernel 2.6.36 编译升级 linux的UPNP支持(转) UPNP协议细节(转) UPnp协议 from wikipedia 考察智力zz JScollPane以及JPanel相关 bmp文件格式 java中对图象文件的处理(读写以及转换) Java媒体框架(JMF),个人很欣赏.... 常用颜色对照表 YUV/YIQ色彩空间的转换 关于Swing实现透明窗体的。我也很喜欢,收藏! java中的数据库程序应用 A*以及迭代加深的A*算法(IDA*) 我的兄弟们之袋鼠篇 我的兄弟们之温J篇 java中的图象处理技术基础 经典搜索算实现之一,广度优先.
深度优先状态搜索法
空空色色 · 2006-11-04 · via 博客园 - 空空色色

      继续未完成之事业.
      今天我们要讲的是深度优先搜索,还是以8数码问题为背景.
      简单的说,深度优先就是沿着一条路径走到底,对于8数码的问题,由于空格只能上下左右的移动(有时候也不全然),因此每种移动策略,都会产生一个不同于当前的状态.
(0代表空格)
比如对于状态          左移             上移 
1  2  3                                           1  2  3                                            1  0  3
4  0  5                        0  4  5                          4  2  5 
6  7  8                                           6  7  8                                            6  7  8   

      所以简单的说,每个状态的可能子状态有(平均起来)3个,依据深度优先的策略,深度搜索可以简单的表示成一个递归的过程。
depthSearch(node T)
{
    visit(T); 
    for each sonNode son of T, do depthSearch(node son);
}
      涉及到具体的实现,那么我们就要对其中的求子节点细化并用语言描述。比如在8数码的背景下,怎么求子节点呢?前面提到,上下左右的移动会产生子节点,那么自然的可以想到,有某中方式来表示空格移动方向,因为要对所有的子接点逐个的进行深度搜索。
一个简单的方法,用一个整数来替代方向,比如0代表左,1代表下,2代表右,3代表上。所以求子接点的函数描述如下:
Node sonNode( Node t, int i)
{
//在这里添加代码。
}
所以8数码的深度状态搜索算法描述如下:
boolean depthSearch(node T)
{
   if(is(T))return TRUE;
   else  if( visit(T)) //访问并检查是否还有子节点没有被访问。
   { 
      for(int i=0;i<4;i++)
      {
         if(able(sonNode(T,i)))
            depthSearch(sonNode(T,i));
      }
   }
   else return  FLASE;
}
其中boolean able(Node n)是用于确定节点n是否曾经被访问过。
那么说了这么多,我们需要保存已经访问过的节点吗??因为节点的数量相当大,所以如果存,将会耗费大量的空间。这里有一个特殊的方法,可以用hash表的方法来确定节点是否被访问。但是如果需要记录路径的话,最好还是将节点存起来,因为需要记录父节点。具体程序见我的文集.