• HNU 12894 Keys dfs


    题意:给你一个N×M的简单图,其中有门,墙,通道,和文件,打开每扇门必须要有某一把特定的钥匙,问你最多能拿到几个文件

    解题思路:深度优先,每一次走一个格子将它标记以后都不走,遇到门以后如果有钥匙,将门打开,如果没有,將门加入队列,搜完以后,遍历没有打开的门看是否已经有钥匙了,如果有 从门开始dfs,直到没有可以打开的门

    解题代码:

      1 // File Name: k.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年08月10日 星期日 16时31分20秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 
     26 using namespace std;
     27 int t; 
     28 int n,m;
     29 int hs[30];
     30 int nv[30];
     31 char str[200][200];
     32 struct node{
     33     int x, y ; 
     34 }site[30][10000];
     35 int nums[30];
     36 int xadd[] = {1,-1,0,0};
     37 int yadd[] = {0,0,-1,1};
     38 int visit[200][200];
     39 int sum = 0;
     40 void dfs(int x , int y)
     41 {
     42     //printf("%d %d %c
    ",x,y,str[x][y]);
     43     for(int i = 0  ;i <= 3;i ++)
     44     {
     45         int tx = x + xadd[i];
     46         int ty = y + yadd[i];
     47         if(!visit[tx][ty])
     48         {
     49             if(str[tx][ty] =='$') 
     50             {
     51                 sum ++ ;
     52                 visit[tx][ty] = 1;
     53                 dfs(tx,ty);
     54             }
     55             else if(str[tx][ty]  == '.')
     56             {
     57                 visit[tx][ty] = 1; 
     58                 dfs(tx,ty);
     59             }else if(str[tx][ty] <= 'z' && str[tx][ty]>= 'a')
     60             {
     61             //    printf("%c
    ",str[tx][ty]);
     62                 hs[str[tx][ty] - 'a'] = 1; 
     63                 visit[tx][ty] =1 ; 
     64                 dfs(tx,ty);
     65             }else if(str[tx][ty] <= 'Z' && str[tx][ty] >= 'A')
     66             {
     67             //    printf("%d %d %c
    ",tx,ty,str[tx][ty]);
     68                 if(hs[str[tx][ty] - 'A'])
     69                 {
     70                     visit[tx][ty] = 1; 
     71                     dfs(tx,ty);
     72                 }else{
     73                     nv[str[tx][ty] - 'A'] ++; 
     74                     site[str[tx][ty] - 'A'][nv[str[tx][ty]-'A']].x = tx; 
     75                     site[str[tx][ty] - 'A'][nv[str[tx][ty]-'A']].y = ty; 
     76                 }
     77             }
     78         }
     79     }
     80 }
     81 int main(){
     82     scanf("%d",&t);
     83     while(t--)
     84     {
     85         memset(visit,0,sizeof(visit));
     86         sum = 0 ; 
     87         memset(str,0,sizeof(str));
     88         memset(hs,0,sizeof(hs));
     89         memset(nv,0,sizeof(nv));
     90         scanf("%d %d",&n,&m); 
     91         for(int i = 1;i <= n;i ++)
     92         {
     93             scanf("%s",&str[i+1][2]);
     94         }
     95         char temp[200] ; 
     96         scanf("%s",temp);
     97         int ltemp = strlen(temp);
     98         if(temp[0] != '0')
     99             for(int i = 0 ;i < ltemp ;i ++)
    100             {
    101                 hs[temp[i] - 'a'] = 1; 
    102             }
    103         for(int i = 1;i <= n + 2 ; i++)
    104             str[i][1] = str[i][m+2] = '.';
    105         for(int i = 1;i <= m + 2 ;i ++ )
    106             str[1][i] = str[n+2][i] = '.';
    107         visit[1][1] = 1 ; 
    108         dfs(1,1);
    109         int ok  = 0 ; 
    110         do{
    111             ok = 0 ; 
    112             for(int i = 0 ;i <= 26;i ++)
    113             {
    114                 if(hs[i] && nv[i])
    115                 {
    116                     //printf("%d
    ",i);
    117                     ok = 1;
    118                     visit[site[i][nv[i]].x][site[i][nv[i]].y] = 1; 
    119                     dfs(site[i][nv[i]].x,site[i][nv[i]].y);
    120                     nv[i]--;
    121                 }
    122             }
    123         }while(ok);
    124         printf("%d
    ",sum);
    125     }
    126     return 0;
    127 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    前端开发 Knockout
    一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器
    七个开源的 Spring Boot 前后端分离项目
    Java老司机:把这些主流技术搞懂,拿20K没问题
    svn无法cleanup解决方案
    软件测试-1挡板测试
    电子琴
    myeclipse10激活注册码生成器代码
    LNK2005
    无法打开包含文件:"fstream.h"
  • 原文地址:https://www.cnblogs.com/zyue/p/3906550.html
Copyright © 2020-2023  润新知