南阳理工OJ 迷宫寻宝(一)DFS
来源:互联网 发布:淘宝店铺怎么传图片 编辑:程序博客网 时间:2024/05/22 04:41
我的思路大概就是先从起点去拿钥匙 不开门 其实如果直接判能不能开门也是可以的 我就懒得改了-- 然后再去搜整张图 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 downstruct 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;}
0 0
- 南阳理工OJ 迷宫寻宝(一)DFS
- 南阳oj 82 迷宫寻宝(一)
- 南阳oj 82 迷宫寻宝(一)
- 南阳理工OJ_题目82 迷宫寻宝(一)
- 【DFS】nyoj 82 迷宫寻宝(一)
- nyoj82寻宝迷宫(一)搜索DFS
- nyoj 82 迷宫寻宝(一)【dfs】
- 一笔画问题(南阳理工oj)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- 迷宫寻宝(一)
- POJ 2513 Colored Sticks
- bzoj 2962 序列操作(线段树)
- Ubuntu14.04安装OpenCV2.9
- windows 不能在本地计算机中起动Tomcat参考特定错误代码4
- POJ 2531-Network Saboteur(dfs+剪枝)
- 南阳理工OJ 迷宫寻宝(一)DFS
- 最小二乘法2个变量
- 黑马程序员——Java概述
- 字符串翻转
- (ZT)ATL:连接点及接收事件的两种方法
- [经典面试题][淘宝]求首尾相连数组的最大子数组和
- aoj0558解题报告(广度优先搜索)
- 博客之星的评选结束了,为互联网后端的技术大牛们鸣不平
- android应用的界面编程