hdu1175连连看 (超强的 剪枝+DFS)

2024-05-12 21:32

本文主要是介绍hdu1175连连看 (超强的 剪枝+DFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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"。

Sample Input
  
3 4 1 2 3 4 0 0 0 0 4 3 2 1 4 1 1 3 4 1 1 2 4 1 1 3 3 2 1 2 4 3 4 0 1 4 3 0 2 4 1 0 0 0 0 2 1 1 2 4 1 3 2 3 0 0

Sample Output
  
YES NO NO NO NO YES
注意:(这条线不能经过其它棋子)意思是走过的路线中,除了起点和终点是有棋子,其他的都是空。
#include<stdio.h>
int n,m,map[1005][1005],flog,vist[1005][1005],si,sj,di,dj;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void DFS(int i,int j,int turn,int dirct)
{int e;//printf("%d %d#%d\n",i,j,turn);if(turn>2)  //如果转了2次以上不行,退回return ;if(i==di&&j==dj)//表明找到了,可以去除棋子{flog=1;return ;}if(map[i][j]!=0&&(i!=si||j!=sj))//如果所走的当前位置不是空位置,除了起点,那么就不能走,退回return ;if(turn==2&&i!=di&&j!=dj)//如果转了2次,但当前的点又和终点不在一个直线上,肯定不能达到,那么退回return ;for(e=0;e<4;e++)if(i+dir[e][0]>0&&i+dir[e][0]<=n&&j+dir[e][1]>0&&j+dir[e][1]<=m)//保证不出界if(!vist[i+dir[e][0]][j+dir[e][1]])     //这点没有走过if(!map[i+dir[e][0]][j+dir[e][1]]||map[i+dir[e][0]][j+dir[e][1]]==map[si][sj]){vist[i+dir[e][0]][j+dir[e][1]]=1;if(i==si&&j==sj)//确定开始走的方向dirct=e;if(e==dirct)//走的方向一致,不用转,不一致,则转一次DFS(i+dir[e][0],j+dir[e][1],turn,e);elseDFS(i+dir[e][0],j+dir[e][1],turn+1,e);vist[i+dir[e][0]][j+dir[e][1]]=0;if(flog)//找到可以行的通,则一直退出return ;}
}int main()
{int i,j,q;while(scanf("%d%d",&n,&m)>0&&(n||m)){for(i=1;i<=n;i++)for(j=1;j<=m;j++){scanf("%d",&map[i][j]);vist[i][j]=0;}scanf("%d",&q);while(q--){flog=0;scanf("%d%d%d%d",&si,&sj,&di,&dj);if(map[si][sj]!=map[di][dj]||si==di&&sj==dj)//如果起点和终点不相等或起点就是终点,那么不行{printf("NO\n");continue;}if(map[si][sj]==map[di][dj]&&map[si][sj]==0)//如果起点和终点相等,但没有棋子,也不行{printf("NO\n");continue;}vist[si][sj]=1;DFS(si,sj,0,0);vist[si][sj]=0;printf("%s\n",flog==1?"YES":"NO");}}
}


这篇关于hdu1175连连看 (超强的 剪枝+DFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983782

相关文章

poj 1564 Sum It Up -- DFS 递归

题意:给一个数 t ,以及 n 个数,求 n 个数中的几个数加起来的和为 t 的情况有多少种。 注意:题目要求相同的组合方式不能出现2次,即 “3 4 1 1 1 1 ” 的结果为:“1+1+1”。 思路:一个  for  循环遍历一遍,每个 i 表示以当前数为起点开始一次DFS递归,当所遍历的和为 t 时,输出该组合方式,如果大于 t 则返回,小于则往下递归。以二维数组保存已经输出过的数据,

洛谷 P1141 01迷宫 (dfs解决)

题目描述 有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格 0 上,那么你可以移动到相邻 4 格中的某一格 1 上,同样若你位于一格 1 上,那么你可以移动到相邻 4 格中的某一格 0 上。 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。 输入格式 第一行为两个正整数 𝑛,𝑚。 下面 𝑛 行,每行 𝑛 个字符,字符只可能是 0 或者

[HDU 4324] Triangle LOVE (拓扑排序,DFS)

HDU - 4324 题意是,一张有 N个点的图,保证每两个点之间有且只有一条有向边连接 求是否存在三元环 用拓扑排序判环,如果存在环,则一定存在三元环 证明如下: 不存在二元环 设存在 n(n>=3)元环 p1->p2->p3->…->pn->p1 1) 若存在边 p3->p1,则存在三元环 (p1->p2->p3->p1) 2) 若不存在 p3->p1,则必然存在 p1->p3

[CSU - 1811 (湖南省赛16)] Tree Intersection (dfs序维护子树+离线询问+树状数组)

CSU - 1811 (湖南省赛16) 给定一棵树,每个节点都有一个颜色 问割掉任意一条边,生成的两个子树中颜色集合的交集大小 这个是 dfs序处理子树 + 离线询问 + bit维护 的解法 首先问题转化为求解一个子树中有多少种颜色以及独有颜色的数量 用总的颜色数量减去独有颜色数量即为这棵子树的答案 先做一遍 dfs,再按 dfs序重新组建颜色序列 这样对子树的询问,就变成

DFS走迷宫(懒猫老师C++完整版)

DFS走迷宫的C++完整版 知识储备一:普通动态二维数组的构造二:栈的构造三:栈的逆序遍历 Main文件代码 该版本代码是配合 懒猫老师用DFS走迷宫视频 基于C++基础所写的完整版(实现了栈逆序遍历),适合小白系统性的学习和复习知识点,只要将下文.h和.cpp和main文件所展示的代码结合起来就是个完整的代码。 知识储备 一:普通动态二维数组的构造 二维数组中不同行的内

fast DFS 单机使用实例

fast DFS 单机使用实例 我在一台服务器上简单测试了fastdfs。client, tracker, storage server都是同一个物理服务器。   1. 编译fastdfs:   sles207:/opt/mars/FastDFS # ./make.sh   storage_service.o: In function `storage_service_init':/opt/ma

腾讯出品 AI绘画Stable Diffusion超强插件,工作流一键保存复用!

大家好,我是向阳 近期,听说老东家腾讯开源了一款超强的Stable Diffuison插件——LightFlow,它可以一键保存所有工作流数据,也就是你辛苦实验、创建好的出图提示词+采样器+相关度+插件参数+……都可以一键保存下来,下次直接快速导入,就可以开始工作,非常的强!快跟我去看看吧~ LightFlow简介 官方简介:一个基于SD的开源插件LightFlow,它可以帮助你一键保存所有

深度神经网络——决策树的实现与剪枝

概述 决策树 是一种有用的机器学习算法,用于回归和分类任务。 “决策树”这个名字来源于这样一个事实:算法不断地将数据集划分为越来越小的部分,直到数据被划分为单个实例,然后对实例进行分类。如果您要可视化算法的结果,类别的划分方式将类似于一棵树和许多叶子。 这是决策树的快速定义,但让我们深入了解决策树的工作原理。 更好地了解决策树的运作方式及其用例,将帮助您了解何时在机器学习项目中使用它们。 决

[深度优先搜索DFS]迷宫问题

描述 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 输入 一个5 × 5的二维数组,表示一个迷宫。数

【LeetCode】 Surrounded Regions (BFS DFS)

题目:Surrounded Regions 广搜和深搜都能解决,但是LeetCode上使用深搜时会栈溢出 DFS: <span style="font-size:18px;">/*LeetCode Surrounded Regions* 题目:给定一个字符数组,由'X'和'O'组成,找到所有被x包围的o并将其替换为x* 思路:只要替换被包围的o就行,如果有一个o是边界或者上下左右中有一个