hdu1175-连连看(dfs)
2024-09-28 17:38:48
一个一个走,记录方向改变了几次,不能超过两次,两次如果还没到终点return;
#include<cstdio> #include<string.h> #define inf 0x3f3f3f3f const int maxn=; using namespace std; const int dir[][]={{,},{,},{,-},{-,}}; int flag[maxn+][maxn+]; int n,m,q; int sx,sy,gx,gy; int a[maxn+][maxn+]; int dfs(int x,int y,int dirc,int turn){
//printf("%d %d %d %d\n",x,y,dirc,turn);
if(turn>) return ;
if(x==gx&&y==gy){
return ;
}
for(int i=;i<;i++){
if(turn==&&i!=dirc) continue;
int nx=x+dir[i][];
int ny=y+dir[i][];
if(nx==gx&&ny==gy){
if(i==dirc||dirc==-) return ;
else if(i!=dirc&&turn+<=) return ;
continue;
}
if(nx>=&&nx<=n&&ny>=&&ny<=m&&!flag[nx][ny]&&!a[nx][ny]){
if(i==dirc||dirc==-){
flag[nx][ny]=;
if(dfs(nx,ny,i,turn)) return ;
} else if(i!=dirc){
flag[nx][ny]=;
if(dfs(nx,ny,i,turn+)) return ;
}
flag[nx][ny]=;
}
}
return ;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
if(n==&&m==) break;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d",&q);
while(q--){
memset(flag,,sizeof(flag));
scanf("%d%d%d%d",&sx,&sy,&gx,&gy);
if(!a[sx][sy]||!a[gx][gy]||a[sx][sy]!=a[gx][gy]){
printf("NO\n");
continue;
}
if(dfs(sx,sy,-,)) printf("YES\n");
else printf("NO\n");
}
}
return ;
}
最新文章
- 项目vue2.0仿外卖APP(四)
- JavaScript:this是什么?
- Linux-awk直接修改原文件
- PHP内核探索之变量(6)- 后续内核探索系列大纲备忘
- segmentfault.com mongo出识以及对数组的操作
- 关于IP地址的一个细节问题
- 关于mysql中int(1)中int后面的数字
- js基础之DOM
- Linux 基本命令学习笔记
- best javascript framework list -- 最好的js框架
- Objective-C对象模型及应用
- Redis 基本安全规范文档
- D3.js使用过程中的常见问题(D3版本D3V4)
- 【原】关于定时回查出现的BUG有感
- 拷贝JAR包
- 杭电ACM2002--计算球体积
- 关于前端滚动条,input框等样式的修改
- C# 语言历史版本和特性
- hdu4190 二分答案
- Writing device drivers in Linux: A brief tutorial