2011年9月11日
摘要: UVA_10085这个题目和八数码问题基本是一样的,只不过八数码问题是求变成指定图形所需的最少步骤,而这个问题是从指定图形出发,去找一个图形使得其按少步骤操作以得到指定图形所需的步骤是所有图形中最多的。从代码的角度讲,八数码问题的广搜的while循环是在遇到指定图形时退出的,而这个问题的while循环只能是在front=rear时退出,这样才算搜完了所有情况。对于八数码问题的相关知识可以参考刘汝佳白书的P132。#include<stdio.h>#include<string.h>#define HASH 100003int st[1000000][9],fa[1000 阅读全文
posted @ 2011-09-11 22:02 Staginner 阅读(644) 评论(0) 推荐(0) 编辑
摘要: UVA_10422一开始本来打算用BFS+Hash判重去做,但是空格有些不好处理,后来发现由于限定了解的层数最多为10,那么直接用DFS也不是很困难的事情。如果直接DFS,节点数是8^10,还是有些多了,但我们可以进行适当的剪枝,我想的剪枝策略有下面两个:①当n=9时,如果空格与中心的曼哈顿距离不等于3,那么就不用再往下搜了,肯定无解。如果曼哈顿距离为3,那么第10步空格一定会走到中央。②对于当前状态,假如已经移动了n步,我们统计所得的棋盘主对角线及其上部白马的个数为p,如果p-2>10-n,也不用继续往下搜了,肯定无解。因为上半部分白马的容量最多为2,p-2为多余的白马,剩余可走步数至 阅读全文
posted @ 2011-09-11 20:14 Staginner 阅读(589) 评论(0) 推荐(0) 编辑
摘要: UVA_10603这个题目和普通的倒水问题不同的是,它不是去求最少的倒水次数,而是求最少的倒水量。普通倒水问题的解法可以参考刘汝佳白书P131。因而我们的判重的时候不能笼统地把所有重复的状态都抛弃,因为有些状态尽管是相同的,但倒水量却有可能不同。于是我们在判重之前,也应分析一下这个状态会不会对我们记录的达到某一水量时所需的倒水总量进行更新,如果进行了更新,那么即使状态与之前相同,我们也应把这个状态当作一个新的状态来处理。那么既然如果更新了记录即便是重复的状态也要当作新状态来处理,我们还有必要进行判重吗?实际上也存在着没有更新记录但确实是一个新状态的情况。 此外,在判重的时候运用了哈希的思想,由 阅读全文
posted @ 2011-09-11 09:34 Staginner 阅读(756) 评论(0) 推荐(0) 编辑