• HDU2102 A计划(bfs)


    题目链接

    A计划

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 30050    Accepted Submission(s): 7533


     

    Problem Description

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
    现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

     

    Input

    输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

     

    Output

    如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

     

    Sample Input

    1

    5 5 14

    S*#*.

    .#...

    .....

    ****.

    ...#.

    ..*.P

    #.*..

    ***..

    ...*.

    *.#..

    Sample Output

    YES

     

    广度优先搜索。

    骑士救出公主的最小时间小于等于T即可。

    找了一处很久的bug,一开始将isvisit数组设为bool类型,用memset函数初始化为0时发生了某种我暂且未知的错误(感谢什造提醒),后将bool类型改为int类型后AC。

    AC代码:

     1 #include<iostream>
     2 #include<sstream>
     3 #include<algorithm>
     4 #include<string>
     5 #include<cstring>
     6 #include<iomanip>
     7 #include<vector>
     8 #include<cmath>
     9 #include<ctime>
    10 #include<stack>
    11 #include<queue>
    12 using namespace std;
    13 char maze[2][10][10];
    14 int isvisit[2][10][10];
    15 int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//方向数组 
    16 int N,M; 
    17 struct node
    18 {
    19     int order,x,y,time;//地图的种类,行,列,时间 
    20     node(int a,int b,int c,int d)
    21     {
    22         order=a;x=b;y=c;time=d;
    23     }
    24 };
    25 bool bfs(int T)
    26 {
    27     queue<node> que;
    28     memset(isvisit,0,sizeof(isvisit));
    29     que.push(node(0,0,0,0));//起点是(0,0,0),起始时间是0 
    30     isvisit[0][0][0]=1;//标记状态 
    31     while(!que.empty())
    32     {
    33         node q=que.front();que.pop();
    34         if(q.time>T) return false;
    35         if(maze[q.order][q.x][q.y]=='P') 
    36             return true;//找到公主
    37         for(int p=0;p<4;p++)//前后左右移动 
    38         {
    39             int ord=q.order,xx=q.x+dx[p],yy=q.y+dy[p];
    40             if(xx<0||xx>=N||yy<0||yy>=M) continue;//超出边界
    41             if(maze[ord][xx][yy]=='*') continue;//撞墙
    42             if(isvisit[ord][xx][yy]) continue; //访问过 
    43             isvisit[ord][xx][yy]=1;//标记状态 
    44             if(maze[ord][xx][yy]=='#')//时空传送 
    45                 {
    46                         ord=!ord;//地图种类由0变为1或由1变为0 
    47                     if(maze[ord][xx][yy]=='*') continue;//撞墙
    48                     if(maze[ord][xx][yy]=='#') continue;//无限循环
    49                     if(isvisit[ord][xx][yy]) continue;//访问过 
    50                     isvisit[ord][xx][yy]=1;//标记状态 
    51                 }
    52             que.push(node(ord,xx,yy,q.time+1));//时间+1,存入队列 
    53         } 
    54     }
    55     return false;//不能找到公主 
    56 }
    57 int main()
    58 {
    59     int C;
    60     cin>>C;
    61     while(C--)
    62     {
    63         int T;
    64         cin>>N>>M>>T;
    65         for(int k=0;k<2;k++)
    66             for(int i=0;i<N;i++)
    67                 for(int j=0;j<M;j++)
    68                     cin>>maze[k][i][j];
    69         
    70         if(bfs(T)) cout<<"YES"<<endl;
    71         else cout<<"NO"<<endl;  
    72     } 
    73 }
    74  
    View Code
  • 相关阅读:
    化DataSet对象并压缩
    数据库连接
    触发器
    事务
    关于C语言的宏
    GCC中的一些参数
    《tkinter实用教程六》tkinter ttk.Label 控件
    《tkinter实用教程三》ttk.Button 控件
    5. 替换空格
    《tkinter实用教程二》ttk 子模块
  • 原文地址:https://www.cnblogs.com/wangzhebufangqi/p/12796135.html
Copyright © 2020-2023  润新知