?? 廣度優先搜索.txt
字號:
#include <iostream.h>
#include <memory.h>
#define SX 11 // 寬
#define SY 10 // 長
int dx[4]={0,0,-1,1}; // 四種移動方向對x和y坐標的影響
int dy[4]={-1,1,0,0};
char Block[SY][SX] = // 障礙表
{{ 1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,1,0,1,0,0,0,0,0,1 },
{ 1,0,1,0,0,0,1,0,1,1,1 },
{ 1,0,0,0,1,0,1,0,0,0,1 },
{ 1,0,1,1,0,0,1,0,0,1,1 },
{ 1,0,1,0,1,1,0,1,0,0,1 },
{ 1,0,0,0,0,0,0,0,1,0,1 },
{ 1,0,1,0,1,0,1,0,1,0,1 },
{ 1,0,0,1,0,0,1,0,1,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1 }};
int AllComplete=0; // 全部完成標志
int LevelNow=1, // 搜索到第幾層
Act, // 現在的移動方向
ActBefore, // 現在的節點的父節點
MaxAct=4, // 移動方向總數
ActNow, // 現在的節點
tx,ty; // 當前坐標
int LevelFoot[200], // 每一層最后的節點
ActHead[3000]; // 每一個節點的父節點
char AllAct[3000]; // 每一個節點的移動方向
char ActX[3000],
ActY[3000]; // 按節點移動后的坐標
char Table[SY][SX]; // 已到過標記
char TargetX=9,
TargetY=8; // 目標點
int ActOK( );
int Test( );
int ActOK( )
{
tx=ActX[ActBefore]+dx[Act-1]; // 將到點的x坐標
ty=ActY[ActBefore]+dy[Act-1]; // 將到點的y坐標
if ((tx>=SX)||(tx<0)) // x坐標出界?
return 0;
if ((ty>=SY)||(ty<0)) // y坐標出界?
return 0;
if (Table[ty][tx]==1) // 已到過?
return 0;
if (Block[ty][tx]==1) // 有障礙?
return 0;
return 1;
}
int Test( )
{
if ((tx==TargetX)&&(ty==TargetY)) // 已到目標
{
int act=ActNow;
while (act!=0)
{
cout<<(int)AllAct[act]; // 一步步向前推出所有移動方向
act=ActHead[act]; // 所以輸出倒了過來
}
return 1;
}
return 0;
}
void main()
{
memset(Table,0,sizeof(Table));
memset(LevelFoot,0,sizeof(LevelFoot));
memset(ActHead,0,sizeof(ActHead));
memset(AllAct,0,sizeof(AllAct));
memset(ActX,0,sizeof(ActX));
memset(ActY,0,sizeof(ActY)); // 變量清零
LevelNow=1;
LevelFoot[1]=0;
LevelFoot[0]=-1;
ActX[0]=1;
ActY[0]=1;
while (!AllComplete)
{
LevelNow++; // 開始搜索下一層
LevelFoot[LevelNow]=LevelFoot[LevelNow-1];
// 新一層的尾節點先設為與上一層相同
for (ActBefore=LevelFoot[LevelNow-2]+1;
ActBefore<=LevelFoot[LevelNow-1];
ActBefore++) // 對上一層所有節點擴展
{
for (Act=1;Act<=MaxAct;Act++) // 嘗試所有方向
{
if ((ActOK( )) && (!AllComplete)) // 操作可行?
{
LevelFoot[LevelNow]++; // 移動尾指針準備加入新
節點
ActNow=LevelFoot[LevelNow]; // 找到加入新節點位置
ActHead[ActNow]=ActBefore; // 置頭指針
AllAct[ActNow]=Act; // 加入新節點
ActX[ActNow]=tx;
ActY[ActNow]=ty; // 存儲移動后位置
Table[ty][tx]=1; // 做已到過標記
if (Test( )) AllComplete=1; // 完成?
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -