连连看(hdu1175 bfs+方向记录+贪心剪枝)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

连连看

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13007    Accepted Submission(s): 3404


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

Input
输入数据有多组。每组数据的第一行有两个正整数n,m(0<n<=1000,0<m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0<q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
 

Output
每一组输入数据对应一行输出。如果能消去则输出"YES",不能则输出"NO"
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m;
int map[1005][1005];
int visit[1005][1005];
int hash[1005][1005];/*因为要回搜,记录所有点的最少转弯次数,剪枝使用,比如搜到i点最少转1次,当又回搜改点时转弯是2次
果断减掉该点,因为1次都不能到那2次就更不能到了,如果1次到了,那2次都不用找了,如果不剪枝白白邮费大量时间搜索无用区域,不信可以去掉hash数组试试,会超时的10000ms啊,以后根据题目招剪枝的条件,条件都在题目中啊*/

struct point
{
      int x;
      int y;
      int de;//记录放向
      int con;//记录转弯次数
};
int dect[4][2] = {1,0,0,-1,-1,0,0,1};
int bfs(point start,point end)
{
    queue<point> q;
    q.push(start);
    visit[start.x][start.y] = 1;
    while(!q.empty())
    {
        point g = q.front();
        q.pop();
        int i;
        for(i = 0; i < 4; i++)
        {
              point t ;
              t.x = g.x + dect[i][0];
              t.y = g.y + dect[i][1];
              if(g.de == -1)
              {
                   t.de = i;t.con = g.con;
              }
              else if(g.de != i)
              {
                   t.de = i;
                   t.con = g.con + 1;
              }
              else
              {
                  t.de = i;t.con = g.con;//转弯次数,转弯方向一样,次数不变,否则次数+1,四个方向分别为1,2,3,4
              }
              if(t.x >= 1 && t.x <= n && t.y >= 1 && t.y <= m&& t.con <= 2&&t.con <= hash[t.x][t.y])
              {
                     if(map[t.x][t.y] == 0 )
                     {    
                          hash[t.x][t.y] = t.con;                      
                          q.push(t);             
                     }
                     if(t.x == end.x && t.y == end.y)
                     {   
                         hash[t.x][t.y] = t.con;                     
                         if(t.con <= 2)
                         {
                          // map[start.x][start.y] = 0;map[end.x][end.y] = 0;
                           return 1;     
                         }       
                     }
              }           
        }
    }
    return -1;
}
int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        int i,j;
        if(n == 0 && m == 0)
             break;
        memset(visit,0,sizeof(visit));
        for(i = 1; i <= n; i++)
        {
              for(j = 1; j <= m; j++)
              {
                    scanf("%d",&map[i][j]);
              }
        }
        int k;
        point start,end;
        scanf("%d",&k);
        while(k--)
        {
            memset(visit,0,sizeof(visit));
            memset(hash,0x3f,sizeof(hash));
            scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
            start.con = 0,start.de = -1;
            int num = bfs(start,end);
            if(map[start.x][start.y] == map[end.x][end.y] && map[start.x][start.y])
            {
                 if(num != -1)
                 {   printf("YES\n");}
                else
                       printf("NO\n");
            }
            else
            {
                printf("NO\n");
            }
        }
        
    }
    return 0;    
}


贪心算法的一些经典实例代码 贪心算法的一些经典实例代码 背包问题 任务选择问题 等等 立即下载

相关推荐

Altium Designer20-柔性PCB绘制技巧

Altium Designer2020-柔性PCB绘制技巧 注:教程所用PCB随意找的,并没有完全绘制完,大家学习PCB折弯方法即可。 1.打开PCB,点击视图->板子规划模式1,如下图所示 2.点击设计->定义分割线,用两条分割线绘出要折弯的区域 3.点击设计->定义弯曲线(弯曲线呈现黄色) 4.用快捷键d,k进入layer manage stack(层叠管理器),在f...

weixin_44450279的博客 1万+

C算法-贪心/回溯/剪枝

leetcode698题,划分为k个相等的子集。 主要是found函数,太难了= =, 摘自百科: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。 3 、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无...

weixin_45554139的博客 856

从RTL到GDSII:DC综合里那些没人告诉你的时钟约束冷知识(附真实工程示例)

本文深入探讨数字IC设计中DC综合阶段的时钟约束冷知识,包括无毛刺时钟切换、寄存器分频时钟约束、虚拟时钟应用等关键技巧。通过真实工程示例,揭示常见约束误区及解决方案,帮助工程师提升时序收敛效率。特别针对input_delay和output_delay在多时钟域场景下的设置陷阱提供实用指南。

weixin_29306317的博客 415

机器学习:决策树的预剪枝和后剪枝

机器学习:决策树的剪枝

zyf2589237189的博客 2431

力扣 1353. 最多可以参加的会议数目两法--遍历贪心剪枝优化

1353. 最多可以参加的会议数目 给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。 你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。 请你返回你可以参加的 最大 会议数目。 示例 1: 输入:events = [[1,2],[2,3],[3,4]] 输出:3 解释:你可以参加所有的三个会议。

xiangguang_fight的博客 528

【暴力-搜索-贪心-剪枝】NOIP2013-Day1——斗地主

前言 从开始做题到AC前前后后花了近一天...=。=... 题意没说清楚关于大王小王的使用啊,只有自己摸索着打,先WA再T,终于AC了,心力憔悴... 甚至TLE习惯了,最后看到绿色的、明亮的AC时,我都没有反应过来,很懵——嗯?我AC了?=。= 题目 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏...

十里寒塘路♣烟花一半醒 456

BFS_连连看游戏 (bfs+贪心)

时间限制: 2 Sec  内存限制: 10 MB 提交: 325  解决: 49 [提交][状态][讨论版] 题目描述 大家都玩过连连看吧!今天我们玩一个类似的游戏。在一个由10*10个小方格组成的矩形里有n(n&lt;=10)对字符(它们是大写字符中的前n个)。矩形里有些位置是可以从上面走过,有些则不能。能走过的位置用'.'标识,不能的用'#'标识。如果2个相同字符是连通的(从一个字符能走到...

代码行 605

HDU1175 连连看BFS + 剪枝

HDU1175 连连看BFS + 剪枝

forever_bryant的博客 1135

2020杭电寒假专题训练1(搜索)

Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The initial...

YeHosea的博客 269

专题整理——搜索技术

知识点整理 递归和全排列 BFS和队列 BFS状态图搜索 DFS回溯与剪枝 题目练习 题目 题解 类型 HDU1253胜利大逃亡 题解 简单BFS POJ3278 Catch That Cow 题解 简单BFS POJ 3126 Prime Path 题解 简单BFS HDU 2102 A计划 题解 简单BFS fzu 2150 Fire Game 题解 双起点BFS HDU2563 统计问题 题解 简单DFS HDU1035 Robot Motion 题解 简单DF

lllllan 358

50道hdu基础搜索总结

Dfs: 大部分是直接递归枚举,即求满足约束条件下的解,虽不用剪枝,但也需要代码能力。 练习递归枚举的题目: 1241       Oil Deposits (dfs的连通块个数) 1016       Prime Ring Problem 1584       蜘蛛牌(简单dfs,简单的剪枝,还有人用DP做(???)) 1426       Sudoku Ki

Ouroboros 301

2018.9.30 ~ 2018.11.1 做题记录

2018.10.1

EM LGH 273

hdu题目分类

基础题: 1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095、1096、1097、1098、1106、1108、1157、1163、1164、1170、1194、1196、1197、1201、1202、1205、1219、1234、1235、1236、1248、1266、1

狗蛋的博客 312

hdu 杭电题目分类

View Code 1 1001 这个就不用说了吧 2 1002 简单的大数 3 1003 DP经典问题,最大连续子段和 4 1004 简单题 5 1005 找规律(循环点) 6 1006 感觉有点BT的题,我到现在还没过 7 1007 经典问题,最近点对问题,用分治 8 1008 简单题 9 1009 贪心 10 1010 搜索题,剪枝很关键 11 1011 12 ...

weixin_30809173的博客 191

hdu分类

【转】杭电题目分类 1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最近点对问题,用分治 1008 简单题 1009 贪心 1010 搜索题,剪枝很关键 1011  1012 简单题 1013 简单题(有个小陷

860

杭电ACM题目分类

http://acm.hdu.edu.cn/listproblem.php?vol=1 http://acm.hdu.edu.cn/forum/ 按此做成就大神之路:   1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最近点对问题,

Kaido0的博客 764

HDU分类

第一篇    1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最近点对问题,用分治 1008 简单题 1009 贪心 1010 搜索题,剪枝很关键 1011 1012 简单题 1013 简单题(有个小陷阱) 1014

DB_water的博客 650

题目合集(仅供参考)

算法题目推荐

2302_79599802的博客 1185
上一篇: Catch him(hdu2531 以点带面的bfs)
下一篇: Ñ​​皇后问题(hdu2553dfs打表)
leonharetd
博客等级 码龄15年 13粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值