找朋友(bfs)搜索(還有隊列思想)

找朋友


Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裏^_^

題目描述

X,作爲戶外運動的忠實愛好者,總是不想呆在家裏。現在,他想把死宅Y從家裏拉出來。問從X的家到Y的家的最短時間是多少。
爲了簡化問題,我們把地圖抽象爲n*n的矩陣,行編號從上到下爲1 到 n,列編號從左到右爲1 到 n。矩陣中’X’表示X所在的初始座標,’Y’表示Y的位置 , ’#’表示當前位置不能走,’ * ’表示當前位置可以通行。X每次只能向上下左右的相鄰的 ’*’ 移動,每移動一次耗時1秒。

輸入

多組輸入。每組測試數據首先輸入兩個整數n,m(1<= n ,m<=15 )表示地圖大小。接下來的n 行,每行n個字符。保證輸入數據合法。

輸出

若X可以到達Y的家,輸出最少時間,否則輸出 -1。

示例輸入

3 3
X#Y
***
#*#
3 3
X#Y
*#*
#*#

示例輸出

4
-1
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char map[16][16];
int vis[16][16];
int jx[]= {1,0,-1,0};
int jy[]= {0,1,0,-1};

struct node
{
    int x,y,ans;
} q[1100];
void bfs(int x,int y,int n,int m )//其中x,y是表示‘X’de 位置座標,
{
    int h=0,tl=0;

    node t,f;
    t.x=x;
    t.y=y;
    t.ans=0;
    vis[t.x][t.y]=1;
    q[tl++]=t;//進隊,
    while(h<tl)
    {
        t=q[h++];//把值付給t
        if(map[t.x][t.y]=='Y')
        {
            printf("%d\n",t.ans);
            return;
        }

        for(int i=0; i<4; i++)
        {
            f.x=t.x+jx[i];
            f.y=t.y+jy[i];
            if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&map[f.x][f.y]!='#'&&vis[f.x][f.y]==0)
            {

                vis[f.x][f.y]=1;
                f.ans=t.ans+1;
                q[tl++]=f;//此時再次進隊,循環,再進隊的話最多可以進四步,因爲此時有四步循環,代表四個方向
            }

        }

    }
    printf("-1\n");
    return;
}
int main()
{
    int n,m,i,j;
    while(~scanf("%d%d",&n,&m))
    {

    memset(vis,0,sizeof(vis));
    for(i=0;i<n;i++)
    {
        scanf("%*c%s",map[i]);
    }
    for(i=0;i<n;i++)//這個兩層for循環的作用是爲了找到X的作標。然後跳出,
    {

     for(j=0;j<m;j++)
     {
         if(map[i][j]=='X')//如果找到X的話,就跳出
            break;
     }
     if(j!=m)//此刻上面的一成循環跳出,有兩種可能,1是找到X,2是找完了一層,沒有找到,需要繼續找第二層,此時j++,應該等於m,如果不等於m的話,說明找到了X,要跳出。
         break;
    }
        bfs(i,j,n,m);
    }
    return 0;
}
 

直到今天,我對此題纔算明白,還有隊列:“先進先出”是說尾巴先進,頭再進,通過下表的的移動來實現的,當head++,時表示下標又向尾巴靠近一步,此時head原來的值就相當於跳出了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章