• BFS-修改范例-开门系列-单扇多类门配多钥匙


    /*
    BFS:多类单个门,配多把钥匙
    */
    
    
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <malloc.h>
    #include <ctype.h>
    #include <math.h>
    #include <string>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #include<queue>
    const int INF = 999999;
    struct node
    {
        int x,y;        
    };
    struct DOOR
    {
        int x,y;
        int find;
    };
    queue<node> q;
    int n,m,time;
    char mp[25][25];
    int vis[25][25];
    int key[5];
    int skey[5];
    DOOR door[5];
    int xx[4]={1,-1,0,0};
    int yy[4]={0,0,1,-1};
    
    int bfs(int x,int y)
    {
        while(!q.empty ())
            q.pop ();
        node from,next;
        int i;
        from.x=x,from.y=y;
        vis[x][y]=1;
        q.push (from);
        while(!q.empty ())
        {
            from=q.front ();
            q.pop ();
            for(i=0;i<4;i++)
            {
                int dx=from.x+xx[i];
                int dy=from.y+yy[i];
                if(dx>=0&&dx<n&&dy>=0&&dy<m&&vis[dx][dy]==0&&mp[dx][dy]!='X')
                {                
                    next.x=dx;
                    next.y=dy;
                    if(mp[dx][dy]=='G') return 1;
                    else if(mp[dx][dy]>='a'&&mp[dx][dy]<='e')//find the key                 
                    {                    
                        vis[dx][dy]=1;
                        key[mp[dx][dy]-'a']++;
                        if(key[mp[dx][dy]-'a']==skey[mp[dx][dy]-'a']&&door[mp[dx][dy]-'a'].find==1)
                        {            
                            door[mp[dx][dy]-'a'].find=2;
                            node t;
                            t.x=door[mp[dx][dy]-'a'].x;
                            t.y=door[mp[dx][dy]-'a'].y;
                            vis[t.x][t.y]=1;
                            q.push (t);
                        }
                        q.push (next);
                    }
                    else if(mp[dx][dy]>='A'&&mp[dx][dy]<='E')//find the door
                    {
                        door[mp[dx][dy]-'A'].x=dx;
                        door[mp[dx][dy]-'A'].y=dy;                    
                        door[mp[dx][dy]-'A'].find=1;
                        if(key[mp[dx][dy]-'A']==skey[mp[dx][dy]-'A']&&door[mp[dx][dy]-'A'].find==1)
                        {            
                            door[mp[dx][dy]-'A'].find=2;
                            node t;
                            t.x=door[mp[dx][dy]-'A'].x;
                            t.y=door[mp[dx][dy]-'A'].y;
                            vis[t.x][t.y]=1;
                            q.push (t);
                        }
                    }
                    else 
                    {
                        vis[dx][dy]=1;
                        q.push (next);
                    }
                }
            }
        }        
        return 0;
    }
    
    int main()
    {
        int i,j;
        int x,y;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==0) break;
            memset(mp,0,sizeof(mp));
            memset(vis,0,sizeof(vis));
            memset(key,0,sizeof(key));
            memset(skey,0,sizeof(skey));
            memset(door,0,sizeof(door));        
            for(i=0;i<n;i++)
            {            
                scanf("%s",mp[i]);
                for(j=0;j<m;j++)   
                {
                    if(mp[i][j]=='S')
                        x=i,y=j;                                            
                    if(mp[i][j]>='a'&&mp[i][j]<='e')
                        skey[mp[i][j]-'a']++;
                }
            }        
            int ans=bfs(x,y);
            if(ans==1)
                printf("YES
    ");            
            else
                printf("NO
    ");
            
        }
        return 0;
    }
    
    
    
    /*
    4 4
    Saaa
    aaaa
    XXAX
    GBbb
    
    
    
    */
  • 相关阅读:
    转:C#操作摄像头
    C# Memcached缓存
    WCF:调用方未由服务器进行身份验证
    SQL Server 存储过程进行分页查询
    SQL Server T-SQL高级查询
    C#设计模式总结(转)
    C#中构造函数和析构函数区别
    C#: static关键字的作用(转)
    C#结构体和类的区别(转)
    .NET多线程编程(转)
  • 原文地址:https://www.cnblogs.com/mochenmochen/p/5156907.html
Copyright © 2020-2023  润新知