实验报告(华容道)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档