有限状态搜索之BFS--再看POJ1753(一)

有近两个月没有练习ACM了,终于在进入5月的时候,决定安排好各种事情,重新把练习算法和数据结构纳入每天必做的事情之中。鉴于上一阶段练习效果,总结出来凡事必“温故而知新,三思而后行”。之前对于ACM

的各路招式(算法)抱有极大的好奇心,一口气做了不少的题,熟练度有提升,但思维能力未觉有所提高。究其原因,也是没做到“温故而知新”,缺少总结和提炼。所以,今天算是“开博立志”,从此做好总结归纳的工作。

  “新长征路”上的第一幕,便就是从以前做过的题目开始复习。回顾上一阶段的练习,当时是从网络上著名的POJ题目分类开始的,第一个问题是POJ1753(http://poj.org/problem?id=1753)。

  题干意思很简单,描述成便于算法分析的说法,即--给定初始状态S0,按照给定的状态转移方法进行状态转移,问至少多少步可以转移到“全为黑”或“全为白”的状态。

  第一步要做的就是“状态编码”,这题之所以简单就在于状态简单且为有限状态。黑白两色用(0,1)表示即可,16个方格就是16个0/1。16个“局部状态”构成一个“全局状态”。二进制编码的话,"全局状态"用一个

unsigned short类型数据就搞定(保险起见,测试下本机unsigned short是否为两个字节哦)。

  第二步要做的就是“状态转移”,按照题干的要求,16个“局部状态”中任意改变一个(0,1编码就是取反),上下左右4个位置的状态也跟着取反。具体实现时考虑下边界问题。

  第三步要做的就是“状态搜索”,由“初始状态编码”按照“状态转移”规定动作进行转化,产生新的“状态编码”,由新状态编码继续这一过程,直到找到目标状态。解题的主干内容就在于这个搜索过程的编码,题目要求最

少的步骤,那么搜索深度要尽量的浅,所以“深搜”肯定不行,看看“广搜”,他的模式是在每个深度上穷尽所有的情况,如果没有找到目标状态,再加深深度,这个题目恰好适合“广搜”的模式。BFS编码要处理的问题主要是

“创建状态队列”,“状态判重”,编码之前想清楚这些问题怎么解决,“三思而后coding”。

  以上就是对整个题目的理解和思考,“有限状态搜索之BFS--再看POJ1753(二)”将结合代码实现以上三步的内容。

时间: 2024-08-02 03:40:56

有限状态搜索之BFS--再看POJ1753(一)的相关文章

Dearboy's Puzzle (poj 2308 搜索 dfs+bfs)

Language: Default Dearboy's Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1202   Accepted: 208 Description Dearboy is a game lover. Recently, he loves playing the game Lian Lian Kan. This game is played on a board with N*M grids

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题) 问题产生: Isenbaev是国外的一个大牛. 现在有许多人要参加ACM ICPC. 一共有n个组,每组3个人.同组的3个人都是队友. 大家都想知道自己与大牛的最小距离是多少. 大牛与自己的最小距离当然是0.大牛的队友和大牛的最小距离是1.大牛的队友的队友和大牛的最小距离是2--以此类推. 如果实在和大牛没有关系的只好输出undefined了. 第一行读入n.表示有n个组.1 ≤ n ≤ 100 接下来n行,每行有3个名字,名字之间用空格隔开.每个名字的开头都是

迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解

1.问题简介 给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem). 迷宫可以以二维数组来存储表示.0表示通路,1表示障碍.注意这里规定移动可以从上.下.左.右四方方向移动.坐标以行和列表示,均从0开始,给定起点(0,0)和终点(4,4),迷宫表示如下: int maze[5][5]={ {0,0,0,0,0}, {0,1,0,1,0}, {0,1,1,0,0}, {0,1,1,0,1}, {0,0,0,0,0} }; 那么下面的迷宫就有两条

广度优先搜索(bfs)

学了将近半年的信息了,昨天猛地间发现我好像不会搜索.... 这就意味着我在noip的时候连暴力都不会打...为了避免这种事情的发生,我决定一定要好好学搜索.. 好了,废话不多说了,下面开始我们的正式话题:广度优先搜索 1.前言 广度优先搜索其实是一种用来遍历连通图的一种算法,它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名.                       貌似有的东西就真的跟徐大佬说的一样:说不清楚,只能靠自己去做题才能真正理解. 所以,如果我说的你不是很明白

层层递进——宽度优先搜索(BFS)

问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/7429645.html 最开始小哼在入口(1,1)处,一步之内可以到达的点有(1,2)和(2,1). 但是小哈并不在这两个点上,那小哼只能通过(1,2)和(2,1)这两点继续往下走. 比如现在小哼走到了(1,2)这个点,之后他又能够到达哪些新的点呢?有(2,2).再看看通过(2,1)又可以到达哪些点呢?可以

深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点)开始,沿着铁轨(边)移动到其他城市(顶点),有两种方法可以用来搜索图:深度优先搜索(DFS)和广度优先搜索(BFS).它们最终都会到达所有连通的顶点,深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现,不同的实现机制导致不同的搜索方式. 1.1 深度优先搜索 深度优先搜索算法有如下规则: 规则1

机房收费系统合作——再看数据库设计

机房合作我负责了最简单的D层,接口层,工厂层.反正D层是我来写,于是数据库索性也就顺便设计了.已经是第三次敲机房收费系统了,每次都是相隔半年左右吧.需求搞得透透的了,数据库也就好设计了.基本跟第二次没什么大的区别,就是把Student表和Card表分开了. 重构的时候,我的数据库几乎什么都用到了:事务,存储过程,触发器,视图,联合查询等等.所以,这次设计数据库还是SO Easy的..并且,为了让婵婵和牛迁迁师哥写的方便,我把组合查询都写成了存储过程!!!!费了一番功夫,但是D层简单了不少.还记得

再看GS线程

再看GS线程 void GameServer::ProcessThreadTry() { int nCount = 0; packet rcvPkt; rcvPkt.data = new char[1024 * 100]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除

再看数据库——(2)视图

概念 *是从用户使用数据库的观点来说的. *从一个或多个表(视图)中导出来的 *一个虚表,或者说查询表 为什么要用视图呢? 一是简单,看到的就是需要的.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件. 二是 安全,通过视图用户只能查询和修改他们所能见到的数据,但不能授权到数据库特定行和特定的列上.通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后