UVA11134 Fabled Rooks

2023-10-27

UVA11134 Fabled Rooks

题目链接

问题解析

在n行n列的棋盘上放n个车,第i个车在给定的矩形Ri之内,且任意两个车不能相互攻击,即任意两个车不在同一行或同一列。求每个车的位置坐标。

首先,一个车所在的行不会影响它所在的列,可以分别求一个车的横坐标和纵坐标,将一个二维的问题转化为一个一维的问题。

现在,我们面临的问题是如何将这n个点分给n个车。
以横坐标xi为例,每个车的x都被限定在了一个区间[xli,xri]之内,不难看出应该应用贪心算法求解。

这里我最开始做的是按照xli从小到大排序,如果相同就按照xri从小到大排序,然后从每个区间的最左端开始遍历,找到比前一个点的x大的就取出。但会遗漏一种情况,即当输入数据为
3
1 1 3 3
1 1 3 3
2 2 2 2
(这里大家可以自己代入看一下,因为是错误方法就不多解释了)

下面是正确的解题思路,因为我们是从左往右取点,如果一个点被多个区间包含,不难判断,我们应该取右端点最小的区间,因为右端点越大,它所能取的值就越多,所以对区间的排序,应该是按照右端点从小到大,如果相同就按左端点从小到大。取点时按照区间从左往右,注意判断当前所取的点之前没有取过。

代码

以下代码可以AC,但时间复杂度较高代码比较繁琐,大家看看思路即可。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 5000 + 10;
typedef pair<int, int> pos;
int N;
struct point 
{
	int num;
	pos resx;
	pos resy;
	int x, y;
};
point points[maxn];
bool cmp1(point a, point b)
{
	if (a.resx.second == b.resx.second)
		return a.resx.first < b.resx.first;
	return a.resx.second < b.resx.second;
}
bool cmp2(point a, point b)
{
	if (a.resy.second == b.resy.second)
		return a.resy.first< b.resy.first;
	return a.resy.second < b.resy.second;
}
bool sortx()
{
	sort(points, points + N, cmp1);
	points[0].x = points[0].resx.first;
	int i, j;
	bool flag = false;
	for (i = 1; i < N; i++)
	{
		for ( j = points[i].resx.first; j <= points[i].resx.second; j++)
		{
			flag = false;
			for (int t = 0; t < i; t++)
			{
				if (j == points[t].x)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				points[i].x = j;
				break;
			}
		}
		if (j > points[i].resx.second)
			return false;
	}
	return true;
}
bool sorty()
{
	sort(points, points + N, cmp2);
	points[0].y = points[0].resy.first;
	int i, j;
	bool flag = false;
	for (i = 1; i < N; i++)
	{
		for (j = points[i].resy.first; j <= points[i].resy.second; j++)
		{
			flag = false;
			for (int t = 0; t < i ; t++)
			{
				if (j == points[t].y)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				points[i].y = j;
				break;
			}
		}
		if (j > points[i].resy.second)
			return false;
	}
	return true;
}
void output()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (points[j].num == i)
			{
				cout << points[j].x << " " <<points[j].y<< endl;
				break;
			}
		}
	}
}
int main()
{
	int x1, y1, x2, y2;
	while (cin >> N && N != 0)
	{
		for (int i = 0; i < N; i++)
		{
			cin >> x1 >> y1 >> x2 >> y2;
			points[i].num = i;
			points[i].resx = make_pair(x1, x2);
			points[i].resy = make_pair(y1, y2);
		}
		if (!sortx())
			cout << "IMPOSSIBLE"<<endl;
		else
		{
			if (!sorty())
				cout << "IMPOSSIBLE"<<endl;
			else
				output();
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UVA11134 Fabled Rooks 的相关文章

  • 差分+差分矩阵(更适合新手宝宝体质)

    快速掌握差分以及差分矩阵 文章目录 快速掌握差分以及差分矩阵 前言 差分 差分的定义 官方解释 差分自定义 跟前缀和放在一起理解 差分数组的应用 题目描述 差分矩阵 与前缀和矩阵进行比较 差分矩阵定义 官方解释 自定义 修改操作 跟前缀和对

随机推荐

  • openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

    文章目录 openGauss学习笔记 43 openGauss 高级数据管理 事件触发器 43 1 语法格式 43 2 参数说明 43 3 示例 openGauss学习笔记 43 openGauss 高级数据管理 事件触发器 触发器会在指定
  • 物联网毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)

    文章目录 0 前言 1 设计架构 功能设计 2 原理图 3 软件设计 4 实现效果 5 相关代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟
  • 傻白入门芯片设计,三大基本定律(十)

    1 摩尔定律 Moore s Law 集成电路上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍 换言之 处理器的性能大约每两年翻一倍 同时价格下降为之前的一半 2 登纳德缩放定律 Dennard Scaling 随着晶体管尺
  • 2023.3.17

    Goby预置了最具攻击效果的漏洞引擎 覆盖Weblogic Tomcat等最严重漏洞 每天从互联网 如CVE 会产生大量的漏洞信息 我们筛选了会被用于真实攻击的漏洞进行每日更新 Goby也提供了可以自定义的漏洞检查框架 发动了互联网的大量安
  • go数组转tree

    数组转 tree目前发现就二种方式 go实现了两种 1 递归模式 2 双重循环 初始化数据 List 结构体 type List struct Name string json name Id int json id Pid int jso
  • (Struts2学习篇) Struts2 拦截器

    版本 struts2 5 5 此实例实现功能 用户需要指定用户名登陆 登陆成功进入相应页面执行操作 否则返回到登陆页面进行登陆 当直接访问操作页面 登陆后才能访问的页面 时则不允许 须返回登陆页面 1 Struts xml配置文件
  • [Ubuntu]安装微信/QQ/TIM的简便方法

    之前尝试过很多在Ubuntu上安装微信 QQ TIM等软件的方法 大多数都是使用Deepin wine再加 deb安装包来完成的 虽然也可以用 但是有时会有各种兼容问题出现 以前没有计较过 都是一个个解决 凑活着用 现在 偶然间找到一个可以
  • SOLO算法学习

    SOLO神经网络学习 在博客的最开始 先简单谈谈图像处理的几大目标 首先是最基本的目标分类 Object Classification 输出结果 图像中是气球 然后目标检测 Object detection 是在图像分类的基础上 给出每个气
  • 【转载】Chrome插件(扩展应用)开发全攻略

    背景 遇到了一些大量重复操作的任务 需要从页面上获取信息 查询对应的说明 整理出对应内容 然后录入到页面 提交保存 操作过程很繁琐 内容需要人为去做细微的修改 无法完全模板化 所以不好批量处理 鉴于此 考虑使用chrome插件 简化其中一些
  • VC++ CString Find函数的用法说明

    名称 CString Find 在一个较大的 字符 串中查找字符或子字符串 int Find TCHAR ch const int Find LPCTSTR lpszSub const int Find TCHAR ch int nStar
  • pycharm入门

    pycharm基础使用步骤 1 下载pycharm 2 新建Python工程 1 如下 点击Create New Project 2 选择保存位置 点击create 3 命名 打开界面如下 4 这时就可以创建文件了 项目文件夹右击new g
  • 全面探索 FreeMarker 模版引擎的扩展性

    FreeMarker 模版引擎简介 FreeMarker 是一个采用 Java 开发的模版引擎 是一个基于模版生成文本的通用工具 FreeMarker 被设计用来生成 HTML Web 页面 特别是基于 MVC 模式的应用程序 虽然 Fre
  • xxxx is deprecated

    编译工程发现json object object get is deprecated 最终解决 jason c库中有声明 deprecated Please use json object object get ex json c库编译的时
  • 中国银行业数字化转型研究报告 附下载

    以在数据化 智能化为特征的数字化转型是银行业的一次产业革命 以支付功能的在线化为例 近年来移动支付领域的 脱媒 给银行上了生动的一课 即使是全国性的大型银行 面对互联网公司的 降维 竞争也是无能为力 区域性银行更是全面失守 这种数字化金融服
  • 如何阻止点击其他区域,input框会失去焦点事件

    如何阻止点击其他区域 input输入框会失去焦点位置 阻止失去焦点 通过a标签 设置user select为none 通过js阻止默认事件 通过内联js实现 在开发过程中 总会碰到以下两个情况 要求点击某个区域 阻止input框 或者设置了
  • 1.30 fcntl函数

    include
  • 什么是super?如何使用super调用超类构造函数?

    从之前的文章中分享过的一些知识 从Box派生的类并没有体现出它们的实际上是多么有效和强大 例如 BoxWeight构造函数明确的初始化了Box 的width height和depth成员 这些重复的代码在它的超类中已经存在 这样做效率很低
  • 7-40 一维数组最大值和最小值交换 (10 分)

    找出含有10个元素一维数组中的最大值和最小值 并互换这两个数的位置 输入格式 在一行中输入10个整数 数据之间只能用1个空格间隔 输出格式 在一行中按照 max 最大值 min 最小值 的格式输出结果 最大值和最小值均原样输出 没有列宽控制
  • 关于C/C++动态申请空间释放和内存泄漏问题介绍

    1 动态申请空间 1 1 基本内容 动态申请的空间没有具体名称 只能通过指针间接访问 无论new还是malloc方式 动态申请空间都是存放在堆中 有别于系统自动分配的空间是存放在堆栈中 即栈 栈中系统分配的空间 在使用结束会自动释放 而程序
  • UVA11134 Fabled Rooks

    UVA11134 Fabled Rooks 题目链接 问题解析 在n行n列的棋盘上放n个车 第i个车在给定的矩形Ri之内 且任意两个车不能相互攻击 即任意两个车不在同一行或同一列 求每个车的位置坐标 首先 一个车所在的行不会影响它所在的列