hdu 1175 连连看(DFS+剪枝)

Problem - 1175 (hdu.edu.cn)

根据转弯次数和有没有找到答案来剪枝

复制代码
#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;
}
复制代码

 

posted @   ACCbulb  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示