hdu 1175 连连看 经典dfs
2015-08-09 17:17
330 查看
采用深度优先搜索,朝四个方向进行搜索,当第一次搜索成功时既可以直接返回, 需要注意的地方是剪枝,本人在网上也参考了别人的剪枝,特别强大。 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 代码 #include<iostream> #include<cstring> using namespace std; int n,m; int map[1005][1005]; int v[1005][1005]; int q; int x1,y11,x2,y2; int fd[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int fdd[4]={1,2,3,4}; int dfs(int x,int y,int dnum,int d){ if(dnum>2) return 0; if(x==x2&&y==y2) return 1; if(dnum==2){ if(x!=x2&&y!=y2) return 0; else if(x==x2) { if(d==1||d==3) return 0; } else if(y==y2){ if(d==2||d==4) return 0; } } for(int i=0;i<4;i++){ int newx = x + fd[i][0]; int newy = y + fd[i][1]; if(dnum==2){ if(x==x2) { if(fd[i][0]!=0) continue; } else if(y==y2){ if(fd[i][1]!=0) continue ; } } if(newx<0||newx>=n||newy<0||newy>=m||v[newx][newy]==1) continue; if(map[newx][newy]==0||newx==x2&&newy==y2) { if(d!=fdd[i]) dnum++; v[newx][newy]=1; if(dfs(newx,newy,dnum,fdd[i])==1) return 1; if(d!=fdd[i]) dnum--; v[newx][newy]=0; } } return 0; } char *out(){ if(map[x1][y11]!=map[x2][y2]||x1==x2&&y11==y2||map[x1][y11]==0) return "NO"; memset(v,0,sizeof(v)); if(dfs(x1,y11,-1,-1)==1) return "YES"; else return "NO"; } int main(){ while(cin>>n>>m,n){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>map[i][j]; } } cin>>q; while(q--){ cin>>x1>>y11; cin>>x2>>y2; x1--;x2--; y11--;y2--; cout<<out()<<endl; } } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- 简单的四则运算
- 数的奇偶性
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 矩阵的乘法操作
- C 语言实现迷宫 DFS算法
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- DFS求岛的个数LeetCode 200. Number of Islands