hdu1175连连看+少量测试数据

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175

题目意思:给一个n*m的图,图中都是数字,0是空的地方,然后有q次询问,问(x1,y1)和(x2,y2)两点是否可以通过两次及以下的转弯到达,这题可以用bfs+优先队列写,也可以用dfs写,我用的是dfs

     代码中注释我觉得比较好理解的,这里就不多写了。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int map[1005][1005];
int v[1005][1005];
int ans=0;
int d[4][2]={1,0,-1,0,0,-1,0,1};
int n,m,x1,x2,y1,y2;
void dfs(int x,int y,int wan,int t)//wan表示转弯的方向,t表示转弯的次数
{
    if(ans) return ;
    if(x<1||x>n||y<1||y>m)
        return ;
    if(v[x][y]) return ;
    if(t>2||(t==2&&(x-x2)&&(y-y2)))//剪枝,转过第二次弯后,如果终点不在同一行或同一列那么肯定要再转弯
        return ;
    if(x==x2&&y==y2)//到终点了
    {
        ans=1;
        return ;
    }
    if(map[x][y]!=0)//0才是可以走的路
    {
        if(x==x1&&y==y1);
        else
            return ;
    }

    for(int i=0;i<4;i++)
    {
        v[x][y]=1;
        if(wan!=i)//转弯的状态用i来记录
        {
            if(x==x1&&y==y1)//由于起点的方向不一定,所以起点的转弯数不能变
                dfs(x+d[i][0],y+d[i][1],i,t);
            else
                dfs(x+d[i][0],y+d[i][1],i,t+1);
        }
        else//没有转弯
            dfs(x+d[i][0],y+d[i][1],wan,t);
        v[x][y]=0;//别玩了把标记还原;
    }
    //cout<<x<<" "<<y<<endl;
}
int main()
{
    while(cin>>n>>m )
    {
        if(n==0&&m==0) break;
        memset(map,0,sizeof(map));
        memset(v,0,sizeof(v));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                cin>>map[i][j];
            }
        int q;
        cin>>q;

        while(q--)
        {
            ans=0;
            cin>>x1>>y1>>x2>>y2;
            if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0)//这里可以把一些 不可能的状态去掉,仔细想想不难理解。
            {
                cout<<"NO"<<endl;
                continue;
            }
            dfs(x1,y1,0,0);
            if(ans)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;

        }
    }
}

下面给出我找到的和我想的一些样例

5 7
0 0 1 0 2 3 4
1 2 0 0 4 3 5
6 5 0 0 0 0 7
0 3 3 5 0 6 7
3 3 3 2 0 0 1
10
1 7 2 5
2 7 4 4
1 3 2 1
1 3 5 7
1 6 2 6
1 1 1 2
3 2 4 4
2 2 1 5
4 3 1 6
2 2 2 2
N
N
Y
N
Y
N
Y
Y
N
Y

3 4
5 0 1 0
0 0 0 0
1 4 0 5
2
3 4 1 1
1 1 3 4
3 4
1 1 0 5
0 0 0 0
5 0 1 0
2
3 1 1 4
1 4 3 1
3 4
5 0 1 0
5 0 0 0
1 4 0 5
4
3 4 1 1
1 1 3 4
2 1 3 4
3 4 2 1
0 0
Y
Y
Y
Y
N
N
Y

时间: 2024-10-11 00:58:26

hdu1175连连看+少量测试数据的相关文章

HDU1175:连连看 [DFS]

题目链接:连连看 题意: 给出一张n*m的图,有q次询问,每次询问给出两个位置,问这两个位置是否能够相消 相消的条件: 1.两个位置可以用线相连且弯折度不超过2 2.两位置数字相同且不为0 分析: 用一个二维数组存储该位置的弯折度,注意剪枝顺序,详情见代码 一开始写dx[],dy[]的时候写成一维,却wa,不清楚为什么 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespa

hdu1175连连看

Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过. 玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格

hdu1175 连连看

连连看 HDU - 1175 “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过. 玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去

hdu1175 连连看 dfs+剪枝

连连看 Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过.玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两

HDU1175连连看 BFS

没啥困难的,bfs模板题,注意一下剪枝 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <cstdlib> #include <list> #include <s

企业Shell面试题14:开发脚本入侵检测与报警案例

面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次. 1.1问题分析 1)首先要说明的是,思考过程的积累比实际代码开发的能力积累更重要. 2)什么是恶意篡改,只要是未经过许可的改动都是篡改. 3)文件内容被改动了会有如下特征. ◎ 大小可能会变化 ◎ 修改时间会变化 ◎ 文件内容会变化,利用md5sum指纹校验 ◎ 增加或删除文件,比对每次检测前后的文件数量. 1.2参考解答

BFS学习总结

BFS学习总结 给你一个n*m的网格迷宫,迷宫中有些格子不能走,其他的格子都能走.然后给你起点与终点,问你从起点走到终点最少需要多少步? 上面的问题就是一个典型的BFS问题,对于这类问题来说,只要你掌握了这类问题的关键思想,其实他们都是可以用类似的思路来做的. 你可以把BFS问题想象成:从一个父亲(起点状态)生儿子(后继状态),儿子又生孙子(后继状态)的过程,只要这个家族中出生了一个满意的后代(终点状态),这个家族就不生了. 但是如果这个家族中有两个完全一样的人出生(他们的辈分不一定相同),那么

Hibernate 优化技术之抓取策略(Fetching strategies)

一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42705585 使用hibernate一年多了,一直觉得他是一个很好用的持久层框架,在处理含有多个复杂的关联关系的数据表时,hibernate提供的各种关联映射可以让我们用少量的代码快速.便捷的去维护各种外键关系,当然他的核心还是允许我们以"面向对象"的方式去操作数据表,因为我们的Java语言就是面向对象的,所以我们使用ORM的持久层框架应该更容易理解和上手,他

基于TableStore的亿级订单管理解决方案

摘要: 一.方案背景 订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大. 一.方案背景订单系统存在于各行各业,如电商订单.银行流水.运营商话费账单等,是一个非常广泛.通用的系统.对于这类系统,在过去十几年发展中已经形成了经典的做法.但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大.数据的重视程