zoukankan      html  css  js  c++  java
  • 杭电胜利大逃亡续

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
     
    Input
    每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括: . 代表路 * 代表墙 @ 代表Ignatius的起始位置 ^ 代表地牢的出口 A-J 代表带锁的门,对应的钥匙分别为a-j a-j 代表钥匙,对应的门分别为A-J 每组测试数据之间有一个空行。
     
    Output
    针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
     
    Sample Input
    4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
     
    Sample Output
    16 -1
     
     
    分析:A-J总共10把钥匙,一个位置可以多次寻觅,故10把钥匙,一个位置最多10中状态,用一个三维数组标记每个位置的状态,再用BFS搜索所有位置,知道不符合条件,则结束。

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    int row,col,t;
    char Map[22][22];
    int flag[2048][22][22];
    int startX,startY;
    int move[][2]={{1,0},{0,-1},{-1,0},{0,1}};
    int tempKey,num;
    struct NodePoint{
     int nodeX,nodeY;
     int key;
     int time;
    };

    bool judge(NodePoint node){
     if(node.nodeX<0||node.nodeX>=row||node.nodeY<0||node.nodeY>=col||Map[node.nodeX][node.nodeY]=='*')
      return false;
     else
      return true;
    }

    int escape(){
    queue<NodePoint>q;
     while(!q.empty())
            q.pop();
    NodePoint temp,front;
    front.nodeX = startX;
    front.nodeY = startY;
    front.time = 0;
    front.key = 0;
    q.push(front);
    while(!q.empty()){
     front=q.front();
     q.pop();
     for(int i=0;i<4;i++){
            temp.nodeX = front.nodeX;
         temp.nodeY = front.nodeY;
         temp.key = front.key;
      temp.nodeX+=move[i][0];
      temp.nodeY+=move[i][1];
      temp.time =front.time+1;
      if(temp.time>=t)//之前放在for 前面,一直wa,原因:
      return -1;//当^出现在第一个位置时,不能结束,导致t时刻它还能逃跑,如果^不在第一个位置则正确
      if(judge(temp)){
       if(Map[temp.nodeX][temp.nodeY]=='^')
        return temp.time;
       if(Map[temp.nodeX][temp.nodeY]=='@'||Map[temp.nodeX][temp.nodeY]=='.'){
        if(!flag[temp.key][temp.nodeX][temp.nodeY]){
         flag[temp.key][temp.nodeX][temp.nodeY]=1;
         q.push(temp); 
                    }
                    continue;
       }
       if((Map[temp.nodeX][temp.nodeY]>='A'&&Map[temp.nodeX][temp.nodeY]<='J')&&!flag[temp.key][temp.nodeX][temp.nodeY]){
        num = Map[temp.nodeX][temp.nodeY]-'A';
        if((temp.key>>num)&1){
         flag[temp.key][temp.nodeX][temp.nodeY]=1;
         q.push(temp);
         
                    }
                    continue;
       }
       if(Map[temp.nodeX][temp.nodeY]>='a'&&Map[temp.nodeX][temp.nodeY]<='j'){
        num = Map[temp.nodeX][temp.nodeY]-'a';
        tempKey=1<<num;
        temp.key = temp.key|tempKey;
        if(flag[temp.key][temp.nodeX][temp.nodeY]!=1){
         flag[temp.key][temp.nodeX][temp.nodeY]=1;
         q.push(temp);
         
                    }
                    continue;
       }
      }
     }
    }
    return -1;
    }

    int main(){
     while(~scanf("%d%d%d",&row,&col,&t)){
            bool ff = false;
      for(int i=0;i<row;i++){
        scanf("%s",Map[i]);
                    if(!ff)
                    {
                        for(int j=0;j<col;j++)
                        {
                            if(Map[i][j]=='@')
                            {
                                startX=i;
                                startY=j;
                                ff=true;
                                break;
                            }
                        }
                    }
       }
      memset(flag,0,sizeof(flag));
      flag[0][startX][startY]=1;
      printf("%d ",escape());
     }
    return 0;
    }
    /*
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};
    struct node
    {
        int x,y;
        int cnt;
        int time;
    };
    char map[22][22];
    int flag[2048][22][22];
    int x1,y1;
    int row,col,t;
    queue<node>q;

    bool judge(node tp)
    {
        if(tp.x<0 || tp.x>=row || tp.y<0 || tp.y>=col || map[tp.x][tp.y]=='*')
            return false;
        return true;
    }

    int bfs()
    {
        while(!q.empty())
            q.pop();
        node temp,p;
        int i,cc;
        p.x=x1;
        p.y=y1;
        p.cnt=0;
        p.time=0;
        q.push(p);
        while(!q.empty())
        {
            p=q.front();
            q.pop();
            if(p.time>=t-1)
                return -1;
            for(i=0;i<4;i++)
            {
                temp=p;
                temp.x+=dir[i][0];
                temp.y+=dir[i][1];
                temp.time=p.time+1;
                temp.cnt=p.cnt;
                if(!judge(temp))
                    continue;
                if(map[temp.x][temp.y]=='^')
                {
                    return temp.time;
                }
                if(map[temp.x][temp.y]=='@' || map[temp.x][temp.y]=='.')
                {
                    if(!flag[temp.cnt][temp.x][temp.y])
                    {
                        flag[temp.cnt][temp.x][temp.y]=1;
                        q.push(temp);
                    }
                    continue;
                }
                if(map[temp.x][temp.y]>='A' && map[temp.x][temp.y]<='J' && !flag[temp.cnt][temp.x][temp.y])
                {
                    cc=temp.cnt;
                    if((cc>>(map[temp.x][temp.y]-'A')) & 1)
                    {
                        flag[temp.cnt][temp.x][temp.y]=1;
                        printf("A~J ");
                        q.push(temp);
                    }
                    continue;
                }
                if(map[temp.x][temp.y]>='a' && map[temp.x][temp.y]<='j')
                {
                    cc=1<<(map[temp.x][temp.y]-'a');
                    temp.cnt=cc | temp.cnt;
                    if(!flag[temp.cnt][temp.x][temp.y])
                    {
                        flag[temp.cnt][temp.x][temp.y]=1;
                        printf("a~j ");
                        q.push(temp);
                    }
                    continue;
                }
            }
        }
        return -1;
    }

    int main()
    {
        while(~scanf("%d%d%d",&row,&col,&t))
        {
            int i,j;
            bool ff=false;
            for(i=0;i<row;i++)
            {
                scanf("%s",map[i]);
                if(!ff)
                {
                    for(j=0;j<col;j++)
                    {
                        if(map[i][j]=='@')
                        {
                            x1=i;
                            y1=j;
                            ff=true;
                            break;
                        }
                    }
                }
            }
            memset(flag,0,sizeof(flag));
            flag[0][x1][y1]=1;
            int res=bfs();
            printf("%d ",res);
        }
        return 0;
    }
    */

  • 相关阅读:
    gulp serve 报错 gulp.ps1
    执行git命令时出现fatal: 'origin' does not appear to be a git repository错误
    利用 SASS 简化 `nth-child` 样式的生成
    git的一些常用命令
    回调函数
    匿名函数
    css消除行内元素的间隙
    @click.native的使用
    Element-ui 下拉列表 选项过多时如何解决卡顿问题
    vue组件通信(父子之间,兄弟之间)
  • 原文地址:https://www.cnblogs.com/hoojjack/p/3958638.html
Copyright © 2011-2022 走看看