hdu 1175 连连看(DFS+剪枝)
根据转弯次数和有没有找到答案来剪枝
#include<iostream> #include<cstring> using namespace std; const int N=1010; int n,m,q,x1,y1,x2,y2,flag; int v[N][N],map[N][N]; int direction[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; #define check(x,y) (x>=1&&x<=n&&y>=1&&y<=m) void DFS(int x,int y,int dir,int turn){ if(turn>2 || flag) return ; if(turn==2 && x!=x2 && y!=y2) return ; if(x==x2 && y==y2 && turn<=2){ flag=1; return ; } for(int i=0;i<4;i++){ int nx=x+direction[i][0]; int ny=y+direction[i][1]; if(!check(nx,ny) || v[nx][ny]==1) continue; if(!map[nx][ny] || (nx==x2&&ny==y2)){ v[nx][ny]=1; if(dir==-1||dir==i) DFS(nx,ny,i,turn); else DFS(nx,ny,i,turn+1); v[nx][ny]=0; } } } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); while(cin>>n>>m && n && m){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>map[i][j]; cin>>q; while(q--){ memset(v,0,sizeof(v)); flag=0; cin>>x1>>y1>>x2>>y2; if(map[x1][y1]!=map[x2][y2] || map[x1][y1]==0){ cout<<"NO"<<endl; continue; } DFS(x1,y1,-1,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)