杭电1175——连连看(DFS)
2016-02-21 16:56
477 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175
# include<stdio.h> # include<string.h> int x1,y1,x2,y2,flag,n,m; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int chess[1005][1005]; int visited[1005][1005]; void dfs(int x,int y,int lastdir,int turn); int main() { int i,j,q; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&chess[i][j]); } } scanf("%d",&q); for(i=1;i<=q;i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); memset(visited,0,sizeof(int)*1005*1005); flag=0; if(chess[x1][y1]!=chess[x2][y2]) printf("NO\n"); else { if((x1==x2&&y1==y2)||chess[x1][y1]==0) { printf("NO\n"); continue; } dfs(x1,y1,-1,0); if(flag==1) printf("YES\n"); else printf("NO\n"); } } } return 0; } void dfs(int x,int y,int lastdir,int turn) //(x,y)表示当前的位置,lastdir表示上次深搜的方向,上下用0表示,左右用1表示 //turn表示转折次数 { if(x<=0||x>n||y<=0||y>m) return ; if(turn>2) return ; if(!((x==x1&&y==y1)||(x==x2&&y==y2))&&chess[x][y]) return; if(x==x2&&y==y2&&turn<=2) { flag=1; return ; } int nx,ny,k; for(k=0;k<4;k++) { nx=x+dir[k][0]; ny=y+dir[k][1]; int curdir=k/2; //判断是否还需要在转折一次 if(visited[nx][ny]) continue; visited[nx][ny]=1; if(curdir+lastdir==1)//当前节点和上次节点的扩展,一个纵向(上下扩展),一个横向(左右扩展),出现转折 { dfs(nx,ny,curdir,turn+1); } else { dfs(nx,ny,curdir,turn); } visited[nx][ny]=0; if(flag==1) return ; } }
相关文章推荐
- spark_3:spark的基础
- 高精度模板总结(string 实现加、减、乘、除)常用版
- JSP内置对象
- Windows命令行视频教程-01-简介命令提示符
- 点击某一个cell中的button,确定这个button所在的行(找superview)
- g++编译时默认支持C++11的几个配置小方法
- android 网络框架性能优化分析
- CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板
- c++的坚持
- Angular JS中scope的作用域
- 树莓派 安装 系统 于配置
- 自己写配置文件
- Binary Tree Right Side View
- 将一句话中单词进行倒置,标点符号不倒置
- Swift实现IOS界面的跳转
- 利用AVPlayer播放iOS沙盒中的视频
- 被嘲笑没有智商的题
- 1. redis简介
- HNIO 2013 bzoj 3139 比赛
- 官方开发文档翻译-Service