队列
队列是在一端插入,另一端删除的特殊线性表。出队的一端称为队头,入队的一端称为队尾。
队头指针:head指向队头元素的前一个位置。
队尾指针:rear指向队尾元素的位置。
- 队列中元素的个数:rear-front。
- 队列不空:front<rear。
- 队列为空:front=rear 。
宽度优先搜索
代码模版
while (front < rear) //队列不为空
{
读取头结点;
扩展新结点; //状态转移
{
if (扩展出的新结点可行) //状态判定,包括状态判重
{
将新结点加入队列,并设置新结点已访问过;
if (新结点是目标结点) //如果没有目标状态,可以不做判断
做相应处理(退出循环、输出当前解、比较解的优劣等)
rear++; //为下一个结点进队做准备
}
}
front++; //当前头结点出队
}
走迷宫
输出从左上角走到右下角至少要经过多少步。计算步数要包括起点和终点。
输入:5 5 输出:9
..###
….
.#.
.#.
.#..
#include
using namespace std;
int R,C,a[42][42]= {0},b[10001][4]= {0};
int yx[5]= {0,-1,0,0,1},yy[5]= {0,0,-1,1,0};
int z[45][45]= {0},aa=1,bb=1;
int main() {
char s[42];
b[1][1]=1;
b[1][2]=1;
b[1][3]=1;
z[1][1]=1;
cin>>R>>C;
for(int i=1; i<=R; i++) {
scanf("%s",s);
for(int j=1; j<=C; j++)
if(s[j-1]=='.')
a[i][j]=1;
}
while(aa0&&z[x][y]==0&&a[x][y]&&x<=R&&y0) {
cout<<z[R][C];
return 0;
}
}
aa++;
}
return 0;
}
要注明补8.15日的blog
要注明补8.15日的blog!