• Codevs 1215 迷宫


    时间限制: 1 s   空间限制: 128000 KB   题目等级 : 黄金 Gold
    题目描述 Description

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

    输入描述 Input Description

    输入的第一行为一个整数m,表示迷宫的数量。 
    其后每个迷宫数据的第一行为一个整数n(n≤16),表示迷宫的边长,接下来的n行每行n个字符,字符之间没有空格分隔。

    输出描述 Output Description

    输出有m行,每行对应的迷宫能走,则输出YES,否则输出NO。

    样例输入 Sample Input
    1 
    7
    s...##.
    .#.....
    .......
    ..#....
    ..#...#
    ###...#
    ......e
    样例输出 Sample Output
    YES
    优先队列,又你妈MLE5555....
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #define N 18
     6 using namespace std;
     7 int map[N][N],n,T,x,y,sx,sy;
     8 int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};
     9 queue<int> qx,qy;
    10 bool BFS()
    11 {
    12     qx.push(x);qy.push(y);
    13     while(!qx.empty())
    14     {
    15         int zx=qx.front();int zy=qy.front();
    16         qx.pop();qy.pop();
    17         if(zx==sx&&zy==sy)
    18           return true;
    19         for(int i=0;i<4;i++)
    20         {
    21             int xx=zx+dx[i],yy=zy+dy[i];
    22             if(map[xx][yy]==1)
    23             {
    24                 qx.push(xx);qy.push(yy);
    25             }
    26         }
    27     }
    28     return false;
    29 }
    30 int main()
    31 {
    32     char sh;
    33     scanf("%d",&T);
    34     while(T--)
    35     {
    36         scanf("%d",&n);
    37         memset(map,0,sizeof(map));
    38         for(int i=1;i<=n;i++)
    39           for(int j=1;j<=n;j++)
    40           {
    41               cin>>sh;
    42               if(sh=='#') map[i][j]=0;
    43               if(sh=='.') map[i][j]=1;
    44               if(sh=='s'){
    45                   x=i;y=j;map[i][j]=1;
    46               }
    47             if(sh=='e'){
    48                 sx=i;sy=j;map[i][j]=1;
    49             }
    50           }
    51         if(BFS())
    52           printf("YES
    ");
    53         else printf("NO
    ");
    54     }
    55     return 0; 
    56 }

    AC代码:(DFS)

     1  #include <iostream>
     2 using namespace std;
     3 const int MAXN=18;
     4 char map[MAXN][MAXN];
     5 int book[MAXN][MAXN];
     6 int flag=0;
     7 int m,n;
     8 int dx[]={0,0,1,-1};
     9 int dy[]={1,-1,0,0};
    10 bool islegal(int x,int y)
    11 {
    12     if (x>=1 && x<=m &&y>=1 && y<=m)
    13         return true;
    14     else return false;
    15 }
    16 void dfs(int x,int y);
    17 int main()
    18 {
    19     cin>>n>>m;
    20     for (int i=1;i<=m;i++)
    21         for (int j=1;j<=m;j++)
    22             cin>>map[i][j];
    23     int p,q;
    24     dfs(1,1);
    25     if (flag==0)
    26         cout<<"NO"<<endl;
    27     return 0;
    28 }
    29 void dfs(int x,int y)
    30 {
    31     book[x][y]=1;
    32     if(flag==1)
    33         return;
    34     if (x==m && y==m)
    35     {
    36         flag=1;
    37         cout<<"YES"<<endl;
    38     }
    39     for (int i=0;i<4;i++)
    40     {
    41         int nx=x+dx[i];
    42         int ny=y+dy[i];
    43         if (map[nx][ny]!='#' && book[nx][ny]==0 && islegal(nx,ny))
    44         {
    45             dfs(nx,ny);
    46             book[nx][ny]==0;
    47         }
    48     }
    49 }
  • 相关阅读:
    素因子分解
    【转载】一张表看懂LTE和5G NR的区别
    看国家宝藏,顺便学习一下国密算法
    LTE-Advanced(4G)主要技术学习:CA、CoMp、HetNet
    未来移动通信的需求与挑战
    傅里叶级数
    正余弦函数的复指数表示
    网络基础——相关面试考点
    操作系统——相关面试考点
    小米2015笔试编程题
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6071930.html
Copyright © 2020-2023  润新知