嘉兴学院数据结构C课程设计资料Word下载.docx

上传人:b****2 文档编号:13430469 上传时间:2022-10-10 格式:DOCX 页数:16 大小:73.06KB
下载 相关 举报
嘉兴学院数据结构C课程设计资料Word下载.docx_第1页
第1页 / 共16页
嘉兴学院数据结构C课程设计资料Word下载.docx_第2页
第2页 / 共16页
嘉兴学院数据结构C课程设计资料Word下载.docx_第3页
第3页 / 共16页
嘉兴学院数据结构C课程设计资料Word下载.docx_第4页
第4页 / 共16页
嘉兴学院数据结构C课程设计资料Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

嘉兴学院数据结构C课程设计资料Word下载.docx

《嘉兴学院数据结构C课程设计资料Word下载.docx》由会员分享,可在线阅读,更多相关《嘉兴学院数据结构C课程设计资料Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

嘉兴学院数据结构C课程设计资料Word下载.docx

在算法中用到的栈采用顺序栈存储结构,将栈定义如下:

StructBox

{

Publicinti;

Publicintj;

Publicintdi;

};

StructStType

PublicBox[]data;

Publicinttop;

StTypest=newStType();

4.算法设计:

求迷宫问题就是在一个指定的迷宫中求出入口到出口的路径。

求解时,通常用的是“穷举求解”的方法。

即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;

否则沿原路退回,换一个方向再继续试探,直到所有可能的通路都试探完为止。

为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。

对于迷宫中的每个方块,有上、下、左、右4个方块相邻,第i行第j列的方块的位置记为(i,j),规定上方方块为方位0,并按顺时针方向递增编号。

在试探过程中,假设从方位0到方位3的方向查找下一个可走的方块。

为了便于回溯,对于可走的方块都要进栈,并试探它的下一可走的方位,将这个可走的方位保存到栈中。

求解迷宫(xi,yi)到(xe,ye)路径的过程是:

先将入口进栈,在栈不空时循环:

取栈顶方块(不退栈),若该方块是出口,则输出栈中所有方块即为路径。

否则,找下一个可走的相邻方块,若不存在这样的方块,说明当前路径不可能走通,则回溯,也就是恢复当前方块为0后退栈。

若存在这样的方块,则将其方位保存到栈顶元素中,并将这个可走的相邻方块进栈(其初始方位设置为-1)。

求迷宫路径的回溯过程中,从前一方块找到一个可走相邻方块即当前方块后,再从当前方块找相邻可走方块,若没有这样的方块,说明当前方块不可能是从入口到出口路径上的一个方块,则从当前方块回溯到前一方块,继续从前一方块找另一个可走的相邻方块。

为了保证试探的可走相邻方块不是已走路径上的方块,如(i,j)已进栈,在试探(i+1,j)的下一可走方块时,又试探到(i,j),这样可能会引起死循环。

为此,在一个方块进栈后,将对应的a数组元素值改为-1(变为不可走的相邻方块),当退栈时(表示该栈顶方块没有可走相邻方块),将其恢复为0。

求解一条从入口(xi,yi)到出口(xe,ye)的迷宫路径的算法如下:

Publicboolmgpath(intxi,intyi,intxe,intye)

IntI,j,k,di,find;

st.data=newBox[MaxSize];

st.top=-1;

//初始化栈顶指针

st.top++;

//初始入口方块进栈

st.data[st.top].i=xi;

st.data[st.top].j=yi;

st.data[st.top].di=-1;

a[xi,yi]=-1;

while(st.top>

-1)//栈不空时循环

{

i=st.data[st.top].i;

j=st.data[st.top].j;

di=st.data[st.top].di;

//取栈顶方块

if(i==xe&

&

j==ye)//找到了出口,输出路径

returntrue;

//找到一条路径后返回true

find=0;

while(di<

4&

find==0)//找到下一个可走方块

di++;

switch(di)

case0:

i=st.data[st.top].i-1;

break;

case1:

j=st.data[st.top].j+1;

case2:

i=st.data[st.top].i+1;

case3:

j=st.data[st.top].j-1;

}

if(a[i,j]==0)find=1;

//找到下一个可走相邻方块

if(find==1)//找到了下一个可走方块

st.data[st.top].di=di;

//修改原栈顶元素的di值

//下一个可走方块进栈

st.data[st.top].i=i;

st.data[st.top].j=j;

st.data[st.top].di=-1;

a[i,j]=-1;

//避免重复走到该方块

else//没有路径可走,则退栈

a[st.data[st.top].i,st.data[st.top].j]=0;

//让该位置变为其他路径可走方案

st.top--;

//将该方块退栈

returnfalse;

//表示没有可走路径,返回false

当采用上述过程找到出口时,栈中从栈底到栈顶恰好是一条从入口到出口的迷宫路径,输出栈底到栈顶的所有方块即为一条从入口到出口的迷宫路径。

5.主程序代码:

usingSystem;

usingSystem.Drawing;

usingSystem.Windows.Forms;

namespace用栈求迷宫

publicpartialclassForm1:

Form

constintM=10;

constintN=10;

constintMaxSize=100;

structBox

publicinti;

publicintj;

publicintdi;

};

structStType

publicBox[]data;

publicinttop;

StTypest=newStType();

intxi,yi,xe,ye;

intcount=1;

publicButton[,]mg=newButton[M,N];

publicintm=M,n=N;

int[,]a=newint[,]{{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},

{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},

{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},

{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},

{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1},

publicForm1()

InitializeComponent();

privatevoidForm1_Load(objectsender,EventArgse)

inti,j;

intx=40,y=120;

Sizes=newSize(30,30);

for(i=0;

i<

M;

i++)

for(j=0;

j<

j++)

mg[i,j]=newButton();

mg[i,j].Left=x;

mg[i,j].Top=y;

mg[i,j].Size=s;

if(a[i,j]==1)

mg[i,j].BackColor=System.Drawing.Color.Blue;

else

mg[i,j].BackColor=System.Drawing.Color.White;

mg[i,j].Visible=true;

mg[i,j].Click+=newSystem.EventHandler(this.button_Click);

this.Controls.Add(mg[i,j]);

x=x+30;

if(x>

=40+M*30)

x=40;

y+=30;

textBox1.Text=Convert.ToString(M);

textBox2.Text=Convert.ToString(N);

button2.Enabled=false;

button3.Enabled=false;

button4.Enabled=false;

privatevoidbutton_Click(objectsender,EventArgse)

Buttonbtn=(Button)sender;

if(btn.BackColor==System.Drawing.Color.Blue)

btn.BackColor=System.Drawing.Color.White;

btn.BackColor=System.Drawing.Color.Blue;

privatevoidbutton1_Click(objectsender,EventArgse)

try

if(textBox1.Text.ToString()!

="

"

m=int.Parse(textBox1.Text.ToString());

m=M;

if(textBox2.Text.ToString()!

n=int.Parse(textBox2.Text.ToString());

n=N;

catch(Exceptionerr)

infolabel.Text="

操作提示:

输入的迷宫大小是错误的,需要重新输入"

;

return;

if(m<

4||m>

10||n<

4||n>

10)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1