首页 > 代码库 > HNU 12894 Keys dfs
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\n",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\n",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\n",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\n",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\n",sum);125 }126 return 0;127 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。