
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXXXX
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
int init();
int bfs();
char s[13][13]={'0'};//初始化同时防止第0行0列的干扰
int x1,y1,x2,y2;
int step[20][20]; //记录所用的步数
queue<int>q1; //q1这个队列表示横坐标
queue<int>q2; //q2表示纵坐标
int main()
{
int result,i,j;
cin>>x1>>y1>>x2>>y2;
for(i=1; i<13; i++)
{
for(j=1; j<13; j++)
{
cin>>s[i][j];
}
}
init();
//初始化
result=bfs();
cout<<result<<endl;
return 0;
}
int init()
{
q1.push(x1);
q2.push(y1);
step[x1][y1]=0;//记录x1,y1为第0步
}
int bfs()
{
int x,y,i;
while(!q1.empty())
{
x=q1.front();//把队首元素取出
q1.pop();
//去除队首元素
y=q2.front();
q2.pop();
//纵坐标与横坐标对应
s[x][y]='X'; //给(x,y)这个点做标记,把它从点变成X,保证下次不用它
if(x==x2&&y==y2)
{
return (step[x][y]);//找到后输出所用步数
}
if(s[x-1][y]=='.')//判断它上面是否为.
{
q1.push(x-1);
q2.push(y);
//把x y放入队列,这时候x和y是一一对应的。
step[x-1][y]=step[x][y]+1;//给步数加一。
}
if(s[x+1][y]=='.')
{
q1.push(x+1);
q2.push(y);
step[x+1][y]=step[x][y]+1;
}
if(s[x][y-1]=='.')
{
q1.push(x);
q2.push(y-1);
step[x][y-1]=step[x][y]+1;
}
if(s[x][y+1]=='.')
{
q1.push(x);
q2.push(y+1);
step[x][y+1]=step[x][y]+1;
}
}
}

被折叠的 条评论
为什么被折叠?



