连连看游戏

连通块+记忆性递归的综合运用

这里x,y的设置反我平常的习惯,搞得我有点晕

实际上可以一输入就交换x,y的数据的

如果设置y1为全局变量的话会warning:

warning: built-in function 'y1' declared as non-function

所以我改成p和q了

刚开始判断能不能相连是靠连通块

后面求最短线段数是靠记忆性递归

代码如下:

#include<stdio.h>
struct Min{int x_d;//x轴的方向int y_d;//y轴的方向int len;
}min[77][77];
void fill(int color, int x, int y);
bool judge(int m1, int n1, int m2, int n2);
void dg(int y, int x, int color, int y_d, int x_d);
int map[77][77];
int w, h, p1, q1, p2, q2;int main(void)
{//板子输入scanf("%d%d", &w, &h);getchar();for(int i = 1; i <= h; i++){char c;for(int j = 1; j <= w; j++)if((c = getchar()) == 'X')map[i][j] = 1;elsemap[i][j] = 0;getchar();}//开始填充连通块int color = 2;fill(color++, 0, 0);for(int i = 1; i <= h; i++)for(int j = 1; j <= w; j++)if(map[i][j] == 0)fill(color++, i, j);//开始判断并计算int n;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d%d%d%d", &p1, &q1, &p2, &q2);if(judge(p1, q1, p2, q2)){printf("impossible\n");continue;}//重置min数组for(int i = 0; i <= h + 1; i++)for(int j = 0; j <= w + 1; j++)min[i][j].len = 100, min[i][j].x_d = 0, min[i][j].y_d = 0;min[q1][p1].len = 0;//求最短线段数(从x1,y1到x2,y2)if(map[q1 + 1][p1] != 1) dg(q1 + 1, p1, map[q1 + 1][p1], 1, 0);if(map[q1 - 1][p1] != 1) dg(q1 - 1, p1, map[q1 - 1][p1], -1, 0);if(map[q1][p1 + 1] != 1) dg(q1, p1 + 1, map[q1][p1 + 1], 0, 1);if(map[q1][p1 - 1] != 1) dg(q1, p1 - 1, map[q1][p1 - 1], 0, -1);//得到最短线段数int minn = 100;if(map[q2 + 1][p2] != 1){int tmp = min[q2 + 1][p2].len + ((min[q2 + 1][p2].x_d == 0 && min[q2 + 1][p2].y_d == -1) ? 0 : 1);minn = (minn < tmp) ? minn : tmp;}if(map[q2 - 1][p2] != 1){int tmp = min[q2 - 1][p2].len + ((min[q2 - 1][p2].x_d == 0 && min[q2 - 1][p2].y_d == 1) ? 0 : 1);minn = (minn < tmp) ? minn : tmp;}if(map[q2][p2 + 1] != 1){int tmp = min[q2][p2 + 1].len + ((min[q2][p2 + 1].x_d == -1 && min[q2][p2 + 1].y_d == 0) ? 0 : 1);minn = (minn < tmp) ? minn : tmp;}if(map[q2][p2 - 1] != 1){int tmp = min[q2][p2 - 1].len + ((min[q2][p2 - 1].x_d == 1 && min[q2][p2 - 1].y_d == 0) ? 0 : 1);minn = (minn < tmp) ? minn : tmp;}//输出if(minn > 10)  printf("impossible\n");else  printf("%d\n", minn);}return 0;
}
void fill(int color, int x, int y)
{if(map[x][y])  return;if(x < 0 || y < 0 || x > h + 1 || y > w + 1)  return;map[x][y] = color;fill(color, x + 1, y), fill(color, x - 1, y);fill(color, x, y + 1), fill(color, x, y - 1);return;
}
bool judge(int m1, int n1, int m2, int n2)
{int tmp1[4] = {map[n1 + 1][m1], map[n1 - 1][m1], map[n1][m1 + 1], map[n1][m1 - 1]};int tmp2[4] = {map[n2 + 1][m2], map[n2 - 1][m2], map[n2][m2 + 1], map[n2][m2 - 1]};for(int i = 0; i < 4; i++){if(tmp1[i] == 1)  continue;for(int j = 0; j < 4; j++){if(tmp2[j] == 1)  continue;if(tmp1[i] == tmp2[j])  return false;}}return true;//只是代表是否执行if,而不是能不能连通
}
void dg(int y, int x, int color, int y_d, int x_d)
{if(x < 0 || y < 0 || x > w + 1 || y > h + 1)  return;if(map[y][x] != color)  return;int tmp = min[y - y_d][x - x_d].len + ((x_d == min[y - y_d][x - x_d].x_d && y_d == min[y - y_d][x - x_d].y_d) ? 0 : 1);if(tmp > min[y][x].len)  return;//等于的话不用返回min[y][x].len = tmp, min[y][x].x_d = x_d, min[y][x].y_d = y_d;dg(y + 1, x, color, 1, 0);dg(y - 1, x, color, -1, 0);dg(y, x + 1, color, 0, 1);dg(y, x - 1, color, 0, -1);return;
}

这里实际上可以改一下目的地的color(本来是1),使旁边的块可以直接走到目的地,而不是目的地旁边

只要在4个方向的递归开始的时候改成相应的颜色就可以了,记得改回来,以后还要用

这样就不会显得累赘,可以把求最短线段数部分和得到最短线段数部分合并,代码会更短一点

懒得改了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些好用的VSCode扩展

可以在扩展这里直接搜索需要的扩展&#xff0c;点击安装即可。 1.Chinese 中文扩展&#xff0c;就是说虽然咱们懂点英语&#xff0c;但还是中文看着方便 2.Auto Rename Tag 当你重命名一个HTML 标签时&#xff0c;会自动重命名与他配对的HTML 标签 当你选择h4这个标签时&…

系列三、DDL

一、DDL 1.1、概述 DDL是英文单词Data Definition Language的缩写&#xff0c;中文意思为数据定义语言&#xff0c;是用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段)的。 1.2、数据库操作 1.2.1、查询所有数据库 show databases; 1.2.2、创建数据库 # 语法 cre…

JAVA基础知识:注解

Java注解是一种元数据&#xff08;metadata&#xff09;机制&#xff0c;它允许我们在代码中添加额外的信息和标记。注解在Java开发中起着重要的作用&#xff0c;可以用于编写文档、代码分析、编译时检查和运行时处理等方面。本文将详细介绍Java注解的基础知识&#xff0c;包括…

云原生基础入门概念

文章目录 云原生的概念云原生的关键技术为何选择云原生&#xff1f;云原生的实际应用 当谈及现代软件开发和IT基础架构时&#xff0c;云原生成为了一个备受关注的话题。它代表了一种软件架构和开发方法&#xff0c;旨在充分利用云计算环境的优势&#xff0c;以提高应用程序的可…

【AI美图】第02期效果图,AI人工智能全自动绘画,美图欣赏

今天给大家献上一组最新提示词 参照图生成图像 依据参照图生成新的图像需要掌握一些技巧&#xff0c;以下是一些可能有用的技巧&#xff1a; 观察参照图&#xff1a;在开始生成新图像之前&#xff0c;仔细观察参照图是非常重要的。你需要了解图像的布局、颜色、线条、细节等…

新一代“垫图”神器,IP-Adapter的完整应用解读

导读 不用训练lora&#xff0c;一张图就能实现风格迁移&#xff0c;还支持多图多特征提取&#xff0c;同时强大的拓展能力还可接入动态prompt矩阵、controlnet等等&#xff0c;这就是IP-Adapter&#xff0c;一种全新的“垫图”方式&#xff0c;让你的AIGC之旅更加高效轻松。 …

2024年 vue3 使用wow.js

准备用vue3搞了懒加载动画功能 被反复折磨了好久&#xff0c;国内资料太少&#xff0c;官方又没找到demo 原来是vue3不支持wowjs vue3换成了wow.js&#xff0c;太容易混淆了&#xff01; npm 安装wow.js main.js 引入import wow.js/css/libs/animate.css 核心代码 import…

智慧工地源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

Python Socket编程

Python Socket编程 文章目录 Python Socket编程1. 弄懂HTTP、Socket、TCP这几个概念五层网络模型 2. client和server实现通信Socket编程模式指南代码实现 3. socket实现聊天和多用户连接4. socket模拟http请求5. socket使用I/O多路复用模式模拟http请求 1. 弄懂HTTP、Socket、T…

k8s-1.24.0版本部署

基础配置[三台centos] 1.关闭防火墙与selinux systemctl stop firewalld systemctl disable firewalld sed -i ‘s/enforcing/disabled/’ /etc/selinux/config setenforce 0 2.添加host记录 cat >>/etc/hosts <<EOF 192.168.180.190 k8s-master 192.168.180.180 k…

51单片机的外部中断的以及相关寄存器的讲解

中断系统 本文主要涉及8051单片机的中断系统的讲解与使用 其中包括中断相关寄存器的介绍与使用以及外部中断初始化的代码分析。 文章目录 中断系统一、 中断的介绍二、 中断结构及相关寄存器2.1 中断源 2.2 中断请求控制器2.2.1 TCON寄存器2.2.2 SCON寄存器2.2.3 中断允许寄存器…

【每日一题】【12.15】2415.反转二叉树的奇数层

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 2415. 反转二叉树的奇数层https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/ 今天终于碰到了一个mid题目&#x…

数据库常用分库分表方案

为什么需要分库分表 分库分表是因应数据库处理大规模数据时所面临的挑战而出现的解决方案. // 提高性能 单个数据库在数据量增加时容易出现性能瓶颈。分库分表可以减轻单个数据库的负担&#xff0c;提高系统的读写性能和响应速度. // 提高并发能力 大量用户同时访问数据库可能…

N-Channel Trench Power MOSFET FMA30H150SL

FMA30H150SL N-Channel Trench Power MOSFET FMA30H150SL Application &#xff1a;  LCD TV  Notebook  Elevator  Inductive heating  Power tools  Broadband FMA30H150SL Features &#xff1a;  30V,150A  RDS(ON)2.4mΩ (Typ.) VGS 10V …

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分&#xff08;Vue3&#xff09;2.1. 新增依赖 cryp…

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况&#xff1f;无论是为了适应不同的播放平台&#xff0c;还是为了满足客户的特定需求&#xff0c;批量调整视频尺寸都是一项繁琐而耗时的工作。但是&#xff0c;现在有一种方法可以让你轻松完成这项任务&#xff0c;那就是使用我们的…

linux系统检测是否受到ddos攻击

在Linux系统上&#xff0c;有一些方法可以帮助检测是否遭受了DDoS攻击。以下是一些常见的方法&#xff1a; 网络流量分析&#xff1a;使用网络分析工具&#xff0c;如tcpdump、Wireshark等&#xff0c;可以捕获网络流量并分析数据包。通过观察数据包的来源、目标、流量等特征&a…

pta单身狗

“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人&#xff0c;以便给予特殊关爱。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤50000&#xff09;&#xff0c;是已知夫妻/伴侣的对数&#xff1b;随后 N 行&#xff0c…

『CV学习笔记』轻量化卷积神经网络MobileNet从V1到V3

轻量化卷积神经网络MobileNet从V1到V3 文章目录 一. 预备知识1.1. 深度可分离卷积(Depthwise Separable Convolution,就是深度卷积+逐点卷积)1.1.1. 标准卷积(Standard convolutional)1.1.2. 深度卷积(Depthwise Convolution)1.1.3. 逐点卷积(Pointwise Convolution,就是11卷…

11-二分-索引二分-第一个错误的版本

这是索引二分的第十一篇算法&#xff0c;来个简单题缓一下&#xff0c;力扣链接 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的…