uva11134 -Fabled Rooks
2016-02-13 20:53
489 查看
题意:
一个n*n的矩阵上放n个车,第i辆车在第i个区间上,每个区间给出左上角和右下角的坐标。任意两个车之间同行同列不能互相攻击,求这些车放置
的坐标。
思路:
第一眼看以为是N皇后的变形,后来发现车子斜上角不会相互攻击。则行列不会相互影响,即该问题可分别分解求行,求列的位置的问题,和上一题uva1422的做法一样,按左区间排序后通过优先级队列按右区间的优先级来做。
代码如下:
一个n*n的矩阵上放n个车,第i辆车在第i个区间上,每个区间给出左上角和右下角的坐标。任意两个车之间同行同列不能互相攻击,求这些车放置
的坐标。
思路:
第一眼看以为是N皇后的变形,后来发现车子斜上角不会相互攻击。则行列不会相互影响,即该问题可分别分解求行,求列的位置的问题,和上一题uva1422的做法一样,按左区间排序后通过优先级队列按右区间的优先级来做。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int N = 5005; int n; struct node { int l, r, id; friend bool operator < (node a, node b) { return a.r > b.r; } }x ,y ,ans ; int cmp(node a, node b) { return a.l < b.l; } int solve() { priority_queue<node> Q; int cur = 0; for (int i = 1; i <= n; i++) { while (cur < n && x[cur].l <= i) Q.push(x[cur++]); if (Q.empty()) return false; node front = Q.top(); Q.pop(); if (front.r < i) return false; ans[front.id].l = i; } cur = 0; for (int i = 1; i <= n; i++) { while (cur < n && y[cur].l <= i) Q.push(y[cur++]); if (Q.empty()) return false; node front = Q.top(); Q.pop(); if (front.r < i) return false; ans[front.id].r = i; } for (int i = 0; i < n; i++) printf("%d %d\n", ans[i].l, ans[i].r); return true; } int main() { while (scanf("%d", &n) && n) { for (int i = 0; i < n; i++) { scanf("%d%d%d%d", &x[i].l, &y[i].l, &x[i].r, &y[i].r); x[i].id = y[i].id = i; } sort(x, x + n, cmp); sort(y, y + n, cmp); if (!solve()) printf("IMPOSSIBLE\n"); } return 0; }
相关文章推荐
- Android_SDK_Windows免费下载链接
- Java Gis 拓扑图(Google 地图)
- VB.NET视频总结(1-7集)
- 电商后台制作遇到的问题
- C++类模板
- Arduino代码机制-引脚读写
- Python算24点
- 成功人士追踪
- 快速初始化 NSArray *viewControllers = @[viewController1, viewController2];
- poj 1088 滑雪
- 书籍名单
- 学习笔记------数据结构(C语言版)串的堆分配存储表示
- 在Sublime Text里开发go
- ASPNET开源项目
- iOS 去掉UITextField前后空格
- iOS开发中对文件目录的访问及管理的基本方法小结
- 简单工厂、工厂方法和抽象工厂的区别
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
- Linux环境下系统函数的使用
- windows java环境变量配置