【poj2157】Maze
2014-03-20 19:55
295 查看
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char map[21][21]; bool vis[21][21],mark[21][21],flag; const int xx[4]={-1,0,1,0},yy[4]={0,-1,0,1}; int n,m,tot,sx,sy; struct key{ int tot,sum; }key[5]; struct door{ int k,x,y; }door[401]; void dfs(int nowx,int nowy){ mark[nowx][nowy]=true; if(flag)return; for(int i=0;i<=3;i++){ int x=nowx+xx[i],y=nowy+yy[i]; if(x<1||y<1||x>n||y>m||map[x][y]=='X'||mark[x][y])continue; else if(map[x][y]>='a'&&map[x][y]<='e'){ dfs(x,y); int tmp=map[x][y]-'a'; if(++key[tmp].sum==key[tmp].tot&&key[tmp].sum) for(int k=1;k<=tot;k++) if(door[k].k==tmp&&vis[door[k].x][door[k].y]) dfs(door[k].x,door[k].y); } else if(map[x][y]>='A'&&map[x][y]<='E'){ vis[x][y]=true; int tmp=map[x][y]-'A'; if(key[tmp].sum==key[tmp].tot&&key[tmp].sum) dfs(x,y); } else if(map[x][y]=='G')flag=true; else dfs(x,y); } } void init(){ memset(vis,0,sizeof(vis)); memset(key,0,sizeof(key)); memset(door,0,sizeof(door)); memset(mark,0,sizeof(mark)); tot=flag=0; } int main(){ while(scanf("%d%d",&n,&m)&&n){ init(); for(int i=1;i<=n;i++){ scanf("%s",map[i]+1); for(int j=1;j<=m;j++){ if(map[i][j]=='S'){ sx=i;sy=j; } else if(map[i][j]>='a'&&map[i][j]<='e')key[map[i][j]-'a'].tot++; else if(map[i][j]>='A'&&map[i][j]<='E'){ door[++tot].x=i;door[tot].y=j;door[tot].k=map[i][j]-'A'; } } } dfs(sx,sy); if(flag)puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- linux gdb调试命令小助手
- 如何设定指定logger的日志级别
- Zdenek Kalal跟踪算法
- EXCEL与SQL数据库间导入导出之傻瓜闲扯淡
- [学习笔记]循环队列和队列的链式结构
- CakePHP是什么?为什么要使用它呢?
- LeetCode之Binary Tree Inorder Traversal
- poj 3320 Jessica's Reading Problem
- Adlist 双向链表的实现 redis
- Android经典的大牛博客推荐
- Hibernate中的session对象update方法的使用
- LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- jq对象和DOM对象的互换
- Velocity布局(layout)功能介绍
- Transport (VMDB) error 44 Message
- poj 1293 Duty Free Shop
- HDU 1010(剪枝+深搜)
- java 图标类Images - ImageIcon
- codeforces 221C Little Elephant and Problem
- 第四周(项目四)——数组做数据成员。