南阳理工OJ 迷宫寻宝(一)DFS
2015-02-20 21:10
190 查看
我的思路大概就是先从起点去拿钥匙 不开门 其实如果直接判能不能开门也是可以的 我就懒得改了-- 然后再去搜整张图 WA了一次是因为拿到钥匙后就拿到了 has++递归回来之后 不要再减回去 因为你已经能拿到了这把钥匙为什么还要放下来退回去??其他就没什么坑了~
#include <cstring> #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <set> #include <queue> #include <climits> #include <utility> using namespace std; int n,m,ex,ey,sx,sy; char mp[25][25]; int dirx[]= {0,0,1,-1}; int diry[]= {1,-1,0,0}; //right left up down struct point { int has; int total; } p[15]; bool vis[25][25]; bool was[25][25]; bool dfs(int x,int y)//能收集到哪些钥匙 { if(x==ex&&y==ey)return true; for(int i=0; i<4; ++i) { int nx=x+dirx[i]; int ny=y+diry[i]; if(nx<0||nx>=n||ny<0||ny>=m)continue; if(mp[nx][ny]>='A'&&mp[nx][ny]<='E')continue; if(mp[nx][ny]!='X'&&!vis[nx][ny]) { //cout<<nx<<" "<<ny<<endl; vis[nx][ny]=true; if(dfs(nx,ny))return true; vis[nx][ny]=false; } } return false; } bool dfsall(int x,int y)//全图搜索 { if(mp[x][y]=='G')return true; for(int i=0;i<4;++i) { int nx=x+dirx[i]; int ny=y+diry[i]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny]&&mp[nx][ny]!='X') { if(mp[nx][ny]=='.'){ vis[nx][ny]=true; if(dfsall(nx,ny))return true; vis[nx][ny]=false; } else if(mp[nx][ny]=='G'){ if(dfsall(nx,ny))return true; } else if(mp[nx][ny]>='a'&&mp[nx][ny]<='e'){ if(!was[nx][ny]){ was[nx][ny]=true; p[mp[nx][ny]-'a'].has++; vis[nx][ny]=true; if(dfsall(nx,ny))return true; vis[nx][ny]=false; } else { vis[nx][ny]=true; if(dfsall(nx,ny))return true; vis[nx][ny]=false; } } else if(mp[nx][ny]>='A'&&mp[nx][ny]<='E') { if(p[mp[nx][ny]-'A'].has==p[mp[nx][ny]-'A'].total){ vis[nx][ny]=true; if(dfsall(nx,ny))return true; vis[nx][ny]=false; }else continue; } } } return false; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)==2) { if(n==0&&m==0)break; memset(was,false,sizeof(was)); memset(p,0,sizeof(p)); for(int i=0; i<n; ++i) { scanf("%s",&mp[i]); } for(int i=0; i<n; ++i) { for(int j=0; j<m; ++j) { if(mp[i][j]>='a'&&mp[i][j]<='e')p[mp[i][j]-'a'].total++; if(mp[i][j]=='S') { sx=i; sy=j; } } } for(int i=0; i<n; ++i) { for(int j=0; j<m; ++j) { if(mp[i][j]>='a'&&mp[i][j]<='e') { memset(vis,false,sizeof(vis)); vis[sx][sy]=true; ex=i; ey=j; if(dfs(sx,sy)) { p[mp[i][j]-'a'].has++; was[i][j]=true; } } } } memset(vis,false,sizeof(vis)); vis[sx][sy]=true; if(dfsall(sx,sy))puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- nyoj82寻宝迷宫(一)搜索DFS
- nyoj82 迷宫寻宝(一)(DFS 推荐看看)
- 南阳理工OJ_题目306 走迷宫
- NYOJ - 82 - 迷宫寻宝(一) (DFS)
- 1178 - 迷宫寻宝(一)(dfs)
- 迷宫寻宝(一)xynuoj1857 && nyoj82
- 南阳理工 oj 图的邻接表dfs dfs 均可
- 【DFS】nyoj 82 迷宫寻宝(一)
- 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题
- 杭电OJ(HDOJ)1010题:Tempter of the Bone(DFS,迷宫求解)
- NYOJ 82. 迷宫寻宝(一)(DFS/BFS)
- nyoj 82 迷宫寻宝(一)【dfs】
- 南阳oj 82 迷宫寻宝(一)
- poj 3984 迷宫问题 dfs 求迷宫路径
- nswoj 1178 - 迷宫寻宝(一)(深搜好题)
- NYOJ-306走迷宫(二分查找+DFS)
- nyoj82(迷宫寻宝)
- 南阳理工oj23
- Unity3D实现立体迷宫寻宝
- 走迷宫(Dfs)