codevs 1215_迷宫_bfs

来源:互联网 发布:男朋友不喜欢狗 知乎 编辑:程序博客网 时间:2024/05/16 13:06

题目描述

在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”)位置处,可以走通则输出YES,不可以走则输出NO。


思路

暴力广搜,判重就可以了
O(n^2)


#include <stdio.h>#include <queue>#include <string>using namespace std;int m,start[3],end[3],a[20][20],fl=0;int dx[5]={0,1,0,-1,0};int dy[5]={0,0,1,0,-1};int bfs(){    queue<int> tx; queue<int> ty;    tx.push(start[1]); ty.push(start[2]);    while (!tx.empty())    {        int xx=tx.front(),yy=ty.front();        tx.pop(); ty.pop();        if (xx==end[1]&&yy==end[2])         {            printf("YES\n");            fl=1;               return 0;        }        for (int i=1;i<=4;i++)            if (dx[i]+xx>=1&&dx[i]+xx<=m&&dy[i]+yy>=1&&dy[i]+yy<=m&&a[dx[i]+xx][dy[i]+yy]==0)            {                a[dx[i]+xx][dy[i]+yy]=1;                tx.push(dx[i]+xx);                ty.push(dy[i]+yy);            }    }}int main(){    int n;    scanf("%d",&n);    for (int k=1;k<=n;k++)    {        fl=0;        scanf("%d",&m);        for (int i=1;i<=m;i++)        {            char ch[20];            scanf("%s",&ch);            for (int j=1;j<=m;j++)            {                if (ch[j-1]=='#') a[i][j]=1;                if (ch[j-1] == 's')                 {                    start[1]=i;                    start[2]=j;                }                if (ch[j-1] == 'e')                 {                    end[1]=i;                    end[2]=j;                }            }        }        bfs();        if (fl==0) printf("NO\n");    }}
1 0
原创粉丝点击