HDU1175连连看 BFS

没啥困难的,bfs模板题,注意一下剪枝

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define maxn 1010
int map[maxn][maxn];
int vis[maxn][maxn];
int n,m;
int d[4][2]={0,1,1,0,0,-1,-1,0};
struct point
{
    int x,y;
    int num;
    int dir;
}s,e;
bool bfs()
{
    queue<point>q;
    vis[s.x][s.y]=0;
    s.num=-1;
    s.dir=-1;
    q.push(s);
    while(!q.empty())
    {
        point u=q.front();
        q.pop();
        if(u.x==e.x&&u.y==e.y&&u.num<=2) return 1;
        for(int i=0;i<4;i++)
        {
            point tmp;
            tmp.x=u.x+d[i][0];
            tmp.y=u.y+d[i][1];
            tmp.dir=i;
            tmp.num=u.num;
            if(tmp.x>=1&&tmp.x<=n&&tmp.y>=1&&tmp.y<=m&&(map[tmp.x][tmp.y]==0||tmp.x==e.x&&tmp.y==e.y))
            {
                if(tmp.dir!=u.dir)
                {
                    tmp.num=u.num+1;
                    if(tmp.num>2) continue;
                    if(vis[tmp.x][tmp.y]>=tmp.num)
                    {
                        vis[tmp.x][tmp.y]=tmp.num;
                        q.push(tmp);
                    }
                }
                else
                {
                    if(vis[tmp.x][tmp.y]>=tmp.num)
                    {
                        vis[tmp.x][tmp.y]=tmp.num;
                        q.push(tmp);
                    }
                }
            }
        }
    }
    return 0;
}
int main()
{
    int t,x1,x2,y1,y2;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0) break;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&map[i][j]);
            }
        }
        scanf("%d",&t);
        while(t--)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    vis[i][j]=4;
                }
            }
            scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
            if(map[s.x][s.y]!=map[e.x][e.y]||map[s.x][s.y]==0||map[e.x][e.y]==0)
            printf("NO\n");
            else if(bfs()) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}
时间: 2024-12-18 14:16:53

HDU1175连连看 BFS的相关文章

HDU 1175 连连看 (BFS带方向的判定)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23172    Accepted Submission(s): 5710 Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其

HDU 1175 连连看(bfs + 剪枝)

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

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连连看+少量测试数据

题目链接: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> u

HDU 1175 连连看(BFS)

题意解析:其实就是判断起始点能否到达终止点.如果起始点和终止点值不同,直接输出NO.bfs,dfs都行. 附加条件:①不能出边界 ②不能走值为0的点 ③路径不能转向两次以上 节点需要记录该点的坐标,方向,转向次数.下面是BFS代码(注意剪枝:超过两次的就不要再加入队列了) #include<iostream> #include<cstdio> #include<queue> #define M 1005 using namespace std; int G[M][M];

hdu1175 连连看 dfs+剪枝

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

BFS学习总结

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