实验报告(华容道)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构
(华容道)
实
验
报
告
实验名称:华容道
学生姓名:
班级:
学号:
日期:
一、实验目的
可以输入华容道游戏的起始布局,求出求解结果。
二、程序分析
2.1存储结构
链式存储结构
2.2程序流程
对于此类问题的求解,一般都是通过搜索空间的方法获得可行解法。这里采用广度优先搜索。理论上讲,广度优先算法得到的第一个解,一定是一个搜索步数最少的解(如有解存在),这正好是华容道游戏的需要。
广度优先搜索算法一般通过队列存储结构实现。由当前布局状态判断哪些棋子可以移动,每移动一个棋子,得到一个新的布局状态,若不是最终解且该布局以前没有出现过,则入队。显然算法在设计细节时需要考虑移动棋子的算法,以及如何判断新的布局状态是否出现过。
2.3关键算法分析
算法1:
MemoryPool::MemoryPool(unsigned int size)
{
if (size <= 100)throw"size should be greater than 100.";
m_Base = new char[size];
if (!m_Base)throw"no enough memory.";
m_PoolSize = size;
m_Frist = NULL;
InsertFreeBlock(m_Base, size - 2 * sizeof(BlockBorder));
}
void MemoryPool::InsertFreeBlock(void *p, int size)
{
FreeBlockHead*s = (FreeBlockHead *)p;
s->BlockLength = size;
p = (char*)p + size + sizeof(BlockBorder);
((BlockBorder*)p)->BlockLength = size;
if (m_Frist)m_Frist->prior = s;
s->next = m_Frist;
s->prior = NULL;
m_Frist = s;
}
void MemoryPool::DeleteFreeBlock(FreeBlockHead *p)
{
if (!p->next && !p->prior)
{
m_Frist = NULL;
}
else if (!p->next&&p->prior)
{
p->prior->next = NULL;
}
else if (!p->prior)
{
p->next->prior = NULL;
m_Frist = p->next;
}
else
{
p->next->prior = p->prior;
p->prior->next = p->next;
}
}
void MemoryPool::SetUsedBorder(void *p, int size)
{
((BlockBorder*)p)->BlockLength = -size;
p = (char*)p + sizeof(BlockBorder) + size;
((BlockBorder*)p)->BlockLength = -size;
}
void * MemoryPool::Allocate(int size)
{
if (m_Frist == NULL) return NULL;
FreeBlockHead *p = m_Frist;
while (p&&p->MemorySize() < size)p = p->next;
if (!p) return NULL;
if (p->MemorySize() <= size + sizeof(FreeBlockHead) + sizeof(BlockBorder)) {
DeleteFreeBlock(p);
SetUsedBorder(p, p->BlockLength);
return (char*)p + sizeof(BlockBorder);
}
else
{
int newsize = p->MemorySize() - size - 2 * sizeof(BlockBorder);
DeleteFreeBlock(p);
InsertFreeBlock(p, newsize);
SetUsedBorder((char*)p + p->BlockSize(), size);
return (char*)p + p->BlockSize() + sizeof(BlockBorder);
}
}
BlockBorder * MemoryPool::GetCurrentBlock(void *p)
{
return(BlockBorder*)((char*)p - sizeof(BlockBorder));
}
BlockBorder* MemoryPool::GetPreBlock(void *p)
{
char *cp = (char*)GetCurrentBlock(p);
if (cp == m_Base) return NULL;
else
{
int len = *(int *)(cp - sizeof(BlockBorder));
cp -= 2 * sizeof(BlockBorder) + (len < 0 ? -len : len);
return (BlockBorder*)p;
}
}
BlockBorder * MemoryPool::GetNextBlock(void *p)
{
BlockBorder * bp = GetCurrentBlock(p);
char *cp = (char*)bp + bp->BlockSize();
return (cp == m_Base + m_PoolSize) ? NULL : (BlockBorder*)cp;
}
void MemoryPool::Free(void *p)
{
BlockBorder * currentBlock = GetCurrentBlock(p);
BlockBorder * nextBlock = GetNextBlock(p);
if (nextBlock&&nextBlock->Free())
{
int size = nextBlock->BlockSize();
DeleteFreeBlock((FreeBlockHead*)nextBlock);
InsertFreeBlock(currentBlock, currentBlock->MemorySize() + size);
}
BlockBorder * preBlock = GetPreBlock(p);
if (preBlock&&preBlock->Free())
{
DeleteFreeBlock((FreeBlockHead*)preBlock);