(规定从右下左上的顺时针方向搜),如下,现在把起点的方向都扩展完了
此时将队首节点出队
然后再找队首的可扩展点 扩展到(2,2)然后将无法扩展的队首出列
#includebits/stdc++.h
using namespace std;
int a【100】【100】;//a【i】【j】=1表示是空地可以走,为0表示不是空地
int v【100】【100】;//v【i】【j】=1表示已经被访问了,为0表示未被访问
struct point{
int x;
int y;
int step;//步数
};
queue<point> r;//申请队列
int dx【4】={0,1,0,-1}; //left;down;right;up
int dy【4】={1,0,-1,0};
int main() {
//input
**/*
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
*/**
int n,m,startx,starty,p,q;
scanf(%d%d,&n,&m);
for(int i=1;i=n;i++){
for(int j=1;j=m;j++){
scanf(%d,&a【i】【j】);
}
}
scanf(%d%d%d%d,&startx,&starty,&p,&q);
//(startx,starty)起点坐标
//(p,q)终点坐标
//BFS
point start;//定义一个结构体类型作为起点
//初始化开始
start.x = startx;
start.y = starty;
start.step = 0;
//初始化结束
r.push(start);//将起点入队
v【startx】【starty】 = 1 ;//设置为已经访问 v为记录该点是否访问过的数组
int flag = 0;
while(!r.empty()){//当r不为空的时候 就对队列进行扩展
if(x==p && y==q){// 到达终点
flag = 1;//到达终点了就把flag设为1
coutr.front().step;
break;
}
//取出队首元素
int x = r.front().x;
int y = r.front().y;
for(int k = 0 ; k<3 ; k++){//四个方向
int tx,ty;
tx = x + dx【k】;
ty = y + dy【k】;
if (a【tx】【ty】==1 && v【tx】【ty】==0){//如果是空地 并且 未被访问过
//入队
point temp;//把拓展的点放到temp里
temp.x = tx;
temp.y = ty;
temp.step = r.front().step + 1 ;
r.push(temp);
v【tx】【ty】 = 1; //设置为已访问
}
}
r.pop();//拓展完了需要将队首元素出队
}
if(flag==0)//没找到
cout<<"no answer";
return 0;
}