当牛牛走完k步后,并把所有的可能都走一遍,不能遍历所有可通行的点,返回-1.
能则返回head追上tail后步长,
-----------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
struct node{
int x;
int y;
int step;
};
int main(){
struct node que[2501];//节点
int n,m;//行 列
int head,tail;//记录当前点和下一步的点
int i,j;
int x0,y0;//起点
int k;//步长
int next[51][2];//下一步
int book[51][51]={0},tx,ty;//记录走过的点
int result;//记录结果的步长
char a[51][51];//地牢
scanf("%d %d",&n,&m);
for(i=0;i<n;i++){
scanf("%s",a[i]);
}
scanf("%d %d",&x0,&y0);
scanf("%d",&k);
for(i=0;i<k;i++){
scanf("%d %d",&next[i][0],&next[i][1]);
}
head = 1;
tail = 1;
que[tail].x=x0;
que[tail].y=y0;
que[tail].step=0;
tail++;
book[x0][y0] = 1;
while(head<tail){
for(int i=0;i<k;i++){//走一步可能走4个方向
tx=que[head].x+next[i][0];
ty=que[head].y+next[i][1];
if(tx<0||ty<0||tx>=n||ty>=m||a[tx][ty]=='X'){continue;}//判断越界和碰到X
if(a[tx][ty]=='.' && book[tx][ty] == 0){//判断在不在.上面,这个位置有没被走过
que[tail].x = tx;
que[tail].y = ty;//走一步后,产生新的节点
que[tail].step = que[head].step+1;//记录该节点的步长
tail++;//下一步的点后移
book[tx][ty] = 1;//记录该点被走过
}
}
head ++;//当前点走一个节点,走完所有节点,赶上tail ,退出循环
}
result = que[tail-1].step;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(book[i][j] == 0 && a[i][j]=='.')
{
result = -1;
}
}
}
printf("%d", result);
}
struct node{
int x;
int y;
int step;
};
int main(){
struct node que[2501];//节点
int n,m;//行 列
int head,tail;//记录当前点和下一步的点
int i,j;
int x0,y0;//起点
int k;//步长
int next[51][2];//下一步
int book[51][51]={0},tx,ty;//记录走过的点
int result;//记录结果的步长
char a[51][51];//地牢
scanf("%d %d",&n,&m);
for(i=0;i<n;i++){
scanf("%s",a[i]);
}
scanf("%d %d",&x0,&y0);
scanf("%d",&k);
for(i=0;i<k;i++){
scanf("%d %d",&next[i][0],&next[i][1]);
}
head = 1;
tail = 1;
que[tail].x=x0;
que[tail].y=y0;
que[tail].step=0;
tail++;
book[x0][y0] = 1;
while(head<tail){
for(int i=0;i<k;i++){//走一步可能走4个方向
tx=que[head].x+next[i][0];
ty=que[head].y+next[i][1];
if(tx<0||ty<0||tx>=n||ty>=m||a[tx][ty]=='X'){continue;}//判断越界和碰到X
if(a[tx][ty]=='.' && book[tx][ty] == 0){//判断在不在.上面,这个位置有没被走过
que[tail].x = tx;
que[tail].y = ty;//走一步后,产生新的节点
que[tail].step = que[head].step+1;//记录该节点的步长
tail++;//下一步的点后移
book[tx][ty] = 1;//记录该点被走过
}
}
head ++;//当前点走一个节点,走完所有节点,赶上tail ,退出循环
}
result = que[tail-1].step;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(book[i][j] == 0 && a[i][j]=='.')
{
result = -1;
}
}
}
printf("%d", result);
}