swustOJ 1615寻宝
2016-04-07 18:46
267 查看
给你一个地图,含有PEX,X表示墙,P表示入口,E表示能通过且只能通过一次,求出能否把地图上的所有E走完;
简单的DFS暴力,注意标记数组与回溯状态;
简单的DFS暴力,注意标记数组与回溯状态;
#include<stdio.h> #include<string.h> char map[10][10]; //地图数组 int use[10][10]; //标记数组 int n,m,sum,count,flag; //n,m长宽,sum为E的总数,count计数,flag表示YES or NO; int dir[4][2]={-1,0,0,-1,1,0,0,1}; //方向数组 void DFS(int x,int y) { if(count==sum) //如果计数和总数相等,flag=1; { flag=1; return ; //记得要返回 } for(int i=0;i<4;i++) //搜索已该点为中心点的四个方向上的点 { int dx=x+dir[i][0]; int dy=y+dir[i][1]; if(dx>=0&&dx<n&&dy>=0&&dy<m&&map[dx][dy]=='E'&&!use[dx][dy]) //满足所有条件 { count++; //计数 use[dx][dy]=1; //标记这个点已经走过了 DFS(dx,dy); //搜索下一个点 count--; //返回到上一个点 use[dx][dy]=0; //返回状态 } } } int main() { int a,b; while(scanf("%d%d",&n,&m)!=EOF) { flag=0; sum=0; count=0; memset(use,0,sizeof(use)); for(int i=0;i<n;i++) scanf("%s",map[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]=='E') //记录总数 sum++; if(map[i][j]=='P') //记录起始P点 { a=i; b=j; } } } DFS(a,b); //搜索整个图; if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- android中listview最后一个item没有下横线的原因?
- Android高级UI之ViewPager实现页卡的最新方法-简洁的TabLayout
- js--引用类型单体内置对象--Math,随机数生成
- C#语言中提供了枚举和整型之间的强制转换功能(SelectItem)
- Jquery开发插件
- 归并排序
- c语言基础概念(3)
- 从 NSURLConnection 到 NSURLSession
- 实战iOS7之NSURLSession
- 替换目标string 中的某些 string的方法。
- js定义对象的方法和继承的方法
- spring-mvc.xml参考
- uint8_t / uint16_t / uint32_t /uint64_t
- swift 中String常用操作
- ConcurrentHashMap原理分析
- java实现SHA1签名加密
- [贪心] BZOJ 3671 [Noi2014]随机数生成器
- LCS算法&最大公共子串&最长公共子序列 PHP 实现
- iOS开发网络篇—NSURLConnection基本使用
- 内存中堆和栈的解释