📄 网络社团--技术文档--迷宫求解的过程演示.htm
字号:
if(tFileName.IsEmpty())<BR>
return;<BR> FILE
*in;<BR> try<BR> {<BR> try<BR> {<BR>
if ((in = fopen(tFileName.c_str(), "w+"))== NULL)<BR>
{<BR>
ShowMessage("不能打开文件!!!");<BR>
throw(0);<BR> }<BR> char
SMark[5]="Labyr";<BR> int tEdition=100;<BR>
fprintf(in, " %s ", SMark);<BR> fprintf(in, " %d ",
tEdition);<BR> fprintf(in, " %d %d ",
LabyrinthRow,LabyrinthCol);<BR> for(int
k=0;k<LabyrinthRow*LabyrinthCol;k++)<BR>
fprintf(in, " %d ", LabyrinthData[k]);<BR>
FileName=tFileName;<BR>
IsChange=false;<BR> }<BR> __finally<BR> {<BR>
fclose(in);<BR> }<BR> }<BR> catch(...)<BR> {<BR>
return;<BR> }<BR>}<BR>void CLabyrinth::GetRowCol(int
&tRow,int
&tCol)<BR>{<BR> tRow=LabyrinthRow;<BR> tCol=LabyrinthCol;<BR>}<BR>void
CLabyrinth::ChangRowCol(int tRow,int
tCol)<BR>{<BR> if(tRow>60||tRow<10||tCol>60||tRow<10)<BR>
{<BR>
ShowMessage("列和行超出边界(60>x>10)");<BR>
return;<BR>
}<BR> LabyrinthData=NULL;<BR> LabyrinthCol=tCol;<BR> LabyrinthRow=tRow;<BR> SetRowCol(LabyrinthRow,LabyrinthCol);<BR> IsChange=true;<BR> Refresh();<BR>}<BR>void
CLabyrinth::SetState(int tRow,int tCol,int tState)<BR>{<BR>
if(tRow>0&&tCol>0&&tRow<=LabyrinthRow&&tCol<=LabyrinthCol)<BR>
{<BR>
if(GetState(tRow,tCol)!=STATE_ENTRY&&GetState(tRow,tCol)!=STATE_END)<BR>
LabyrinthData[ConvertRC(tRow,tCol)]=tState;<BR>
}<BR>}</P>
<P>void CLabyrinth::ChangeState(int OldState,int NewState,int
Times)<BR>{<BR> int tCount=0;<BR> for(int
k=0;k<LabyrinthRow*LabyrinthCol;k++)<BR>
{<BR>
if(LabyrinthData[k]==OldState)<BR>
{<BR>
IsChange=true;<BR>
LabyrinthData[k]=NewState;<BR>
tCount++;<BR> int
tCol,tRow;<BR>
tRow=k/LabyrinthCol;<BR>
tCol=k%LabyrinthCol;<BR>
Refresh(tRow+1,tCol+1);<BR>
if(tCount==Times)<BR>
return ;<BR> }<BR> }</P>
<P>}</P>
<P>bool CLabyrinth::LoadFromFile(AnsiString
tFileName)<BR>{<BR> FILE *in;<BR> try<BR>
{<BR> try<BR> {<BR> if ((in =
fopen(tFileName.c_str(), "r"))== NULL)<BR>
{<BR>
ShowMessage("不能打开文件!!!");<BR>
throw(0);<BR> }<BR>
rewind(in);<BR> char Mark[5];<BR>
AnsiString SMark="Labyr";<BR> fscanf(in, " %s ",
Mark);<BR> AnsiString tempStr=Mark;<BR>
tempStr=tempStr.SubString(1,5);<BR>
if(tempStr!=SMark)<BR> {<BR>
ShowMessage("该文件不是迷宫数据文件");<BR>
throw(0);<BR> }<BR> int
tRow,tCol;<BR> int tEdition;<BR> fscanf(in,
" %d ", &tEdition);<BR> fscanf(in, " %d %d ",
&tRow,&tCol);<BR>
LabyrinthCol=tCol;<BR> LabyrinthRow=tRow;</P>
<P> SetMemory();<BR> int
tState;<BR> for(int
k=0;k<LabyrinthRow*LabyrinthCol;k++)<BR>
{<BR>
if(feof(in))<BR>
{<BR>
ShowMessage("文件被破坏!!!");<BR>
throw(0);<BR>
}<BR> fscanf(in, " %d ",
&tState);<BR>
LabyrinthData[k]=tState;<BR> }<BR>
FileName=tFileName;<BR> IsChange=false;</P>
<P><BR> }<BR> __finally<BR> {<BR>
fclose(in);<BR> }<BR> }<BR> catch(...)<BR>
{<BR> return false;<BR> }<BR>}</P>
<P><BR>bool CLabyrinth::GetNewPoint(int Direction,int &tRow,int
&tCol,int &tState)<BR>{<BR>int OldCol=tCol;<BR>int
OldRow=tRow;<BR>switch(Direction)<BR> {<BR> case 1:
tCol=tCol;tRow=tRow-1;break;<BR> case 2:
tCol=tCol+1;tRow=tRow;break;<BR> case 3:
tCol=tCol;tRow=tRow+1;break;<BR> case 4:
tCol=tCol-1;tRow=tRow;break;<BR> default :return
false;<BR> }<BR> tState=GetState(tRow+1,tCol+1);<BR> if((tState==STATE_PASS||tState==STATE_END)&&AlreadPassList->IndexOf(Format("X:%dY:%d",ARRAYOFCONST((OldCol+1,OldRow+1))))<0)//发现了新的结点<BR>
return true;<BR> return false;<BR>}<BR>void
CLabyrinth::FindResult(TPoint *tStartPoint)<BR>{<BR> SPoint
*StartSPoint;<BR> SPoint *CurrentSPoint;<BR> SPoint
*StopSPoint;//=new SPoint();<BR> TPoint StartPoint;<BR>
TPoint StopPoint;<BR> int tCount=0;<BR>
AlreadPassList->Clear();<BR> for(int
l=0;l<LabyrinthRow;l++)<BR> for(int
k=0;k<LabyrinthCol;k++)<BR>
{<BR>
if(LabyrinthData[l*LabyrinthCol+k]==STATE_ENTRY)<BR>
{<BR>
StartPoint.x=k;<BR>
StartPoint.y=l;<BR>
tCount++;<BR>
break;<BR>
}<BR>
if(LabyrinthData[l*LabyrinthCol+k]==STATE_END)<BR>
{<BR>
StopPoint.x=k;<BR>
StopPoint.y=l;
tCount++;<BR> break;</P>
<P>
}<BR>
if(tCount==2)<BR>
break;<BR> }</P>
<P> if(tStartPoint!=NULL)<BR>
CurrentSPoint=new SPoint(*tStartPoint);<BR>
else<BR> CurrentSPoint=new
SPoint(StartPoint);<BR> StopSPoint=new
SPoint(StopPoint);<BR> StartSPoint=CurrentSPoint;<BR>
if(CurrentSPoint->X>StopSPoint->X)<BR>
CurrentSPoint->PriorityDirection=4;<BR>
else<BR>
CurrentSPoint->PriorityDirection=2;</P>
<P> CShed<SPoint>tShed;</P>
<P> int NowState;<BR> int CX,CY;<BR>
while(1)<BR> {<BR>
if(PowerExit)<BR>
break;<BR> do{<BR>
if(PowerExit)<BR>
break;<BR>
CurrentSPoint->Count++;<BR> bool
tNeedPush;<BR>
CX=CurrentSPoint->X;<BR>
CY=CurrentSPoint->Y;<BR>
switch(CurrentSPoint->Count)<BR>
{<BR> case 0:
tNeedPush=GetNewPoint(CurrentSPoint->PriorityDirection,CY,CX,NowState);
break;<BR> case
1:<BR> case
2:<BR> case
3:<BR> case 4:
tNeedPush=GetNewPoint(CurrentSPoint->Count,CY,CX,NowState);break;<BR>
default:
tNeedPush=false;<BR>
SetState(CurrentSPoint->Y+1,CurrentSPoint->X+1,STATE_PASS);<BR>
Refresh(CurrentSPoint->Y+1,CurrentSPoint->X+1);<BR>
AlreadPassList->Add(Format("X:%dY:%d",ARRAYOFCONST((CurrentSPoint->X+1,CurrentSPoint->Y+1))));<BR>
CurrentSPoint=tShed.Pop();<BR>
if(FMyEvent)<BR>
FMyEvent(EVENT_BACKDATE);<BR>
break;<BR>
}<BR>
if(tNeedPush)<BR>
{<BR> int
OldPriorityDirection=CurrentSPoint->PriorityDirection;<BR>
int
OldCount=CurrentSPoint->Count;<BR>
SetState(CurrentSPoint->Y+1,CurrentSPoint->X+1,STATE_PASSED);<BR>
Refresh(CurrentSPoint->Y+1,CurrentSPoint->X+1);<BR>
tShed.Push(CurrentSPoint);<BR>
if(FMyEvent)<BR>
FMyEvent(EVENT_PAINT);<BR>
CurrentSPoint=new
SPoint(CX,CY);<BR>
if(OldCount==0)<BR>
CurrentSPoint->PriorityDirection=OldPriorityDirection;<BR>
else<BR>
CurrentSPoint->PriorityDirection=OldCount;<BR>
if(NowState==STATE_END)<BR>
{<BR>
MessageDlg("恭喜你!!!", mtInformation, TMsgDlgButtons()<<mbOK,
0);<BR>
ChangeState(STATE_PASSED,STATE_PASS);<BR>
Refresh();<BR>
if(FMyEvent)<BR>
FMyEvent(EVENT_OK);<BR>
return;<BR>
}<BR>
break;<BR>
}<BR>
}while(CurrentSPoint);<BR>
if(CurrentSPoint==NULL)//没有解<BR>
{<BR>
MessageDlg("本迷宫没有通路。", mtWarning, TMsgDlgButtons()<<mbOK,
0);<BR>
if(FMyEvent)<BR>
FMyEvent(EVENT_OK);<BR>
return;<BR>
}<BR> }</P>
<P> PowerExit=false;<BR>}</P>
<P>//下面是栈的成员函数<BR>template<class T><BR>__fastcall
CShed<T>::CShed()<BR>{<BR> List=new
TList();<BR>}<BR>template<class T> __fastcall
CShed<T>::~CShed()<BR>{<BR> while(List->Count)<BR>
{<BR> T *temp=(T
*)List->Items[0];<BR> delete
temp;<BR> List->Delete(0);<BR>
}<BR>}<BR>template<class T> T
*CShed<T>::Pop()<BR>{<BR> if(!List->Count)<BR>
return NULL;</P>
<P> T *temp=(SPoint
*)List->Items[List->Count-1];<BR>
List->Delete(List->Count-1);<BR> return temp;</P>
<P> </P>
<P>}<BR>template<class T> void CShed<T>::Push(T
*point)<BR>{<BR> List->Add(point);</P>
<P>}<BR>///////////////////</P>
<P> </P><BR><!-- #EndEditable --></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<CENTER>
<SCRIPT language=JavaScript
src="网络社团--技术文档--迷宫求解的过程演示.files/bottom.js"></SCRIPT>
<TABLE cellSpacing=0 cellPadding=0 width=500 align=center border=0>
<TBODY>
<TR>
<TD class=myknotse1 align=middle><BR>本网站所有资料版权归结网络社团所有<BR>© 2002~2003<FONT
color=white size=1></FONT></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -