UVA - 11134

We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to the following restrictions

  • The i-th rook can only be placed within the rectan- gle given by its left-upper corner (xli,yli) and its right- lower corner (xri,yri), where 1 ≤ i ≤ n, 1 ≤ xli ≤ xri ≤n,1≤yli ≤yri ≤n.

  • No two rooks can attack each other, that is no two rooks can occupy the same column or the same row.

    Input

    The input consists of several test cases. The first line of each
    of them contains one integer number, n, the side of the board. n lines follow giving the rectangles
    where the rooks can be placed as described above. The i-th line among them gives xli, yli, xri, and
    yri. The input file is terminated with the integer ‘0’ on a line by itself.

    Output

    Your task is to find such a placing of rooks that the above conditions are satisfied and then output n
    lines each giving the position of a rook in order in which their rectangles appeared in the input. If there
    are multiple solutions, any one will do. Output ‘IMPOSSIBLE’ if there is no such placing of the rooks.

    Sample Input

    8
    1122
    5788
    2255
    2255
    6386
    6385
    6388
    3678
    8
    1122
    5788
    2255
    2255
    6386
    6385
    6388
    3678
    0

    Sample Output

    11
    58
    24
    42
    73
    85
    66
    37
    11
    58
    24
    42
    73
    85
    66
    37


白书
在n*n的棋盘上面放n个车,能否使他们互相不攻击(即不能在同一行一列),并且第i个车必须落在第i的矩形范围(xl,yl, xr,yr)之内
行列可以分开求解,变成了区间问题
一开始想按r小大排序,r相同按l排序,然后依次选择行了
然而,应该是“对于每个位置,选择合法且r最小的”,这样排序并不能保证
只好n^2暴力找了
 
//
// main.cpp
// uva11134
//
// Created by Candy on 10/17/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=5e3+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n;
int x[N],y[N];
struct data{
int id;
int l1,r1,l2,r2;
}a[N];
//bool cmp1(data &x,data &y){
// if(x.l1==y.l1) return x.r1<y.r1;
// else return x.l1<y.l1;
//}
//bool cmp2(data &x,data &y){
// if(x.l2==y.l2) return x.r2<y.r2;
// return x.l2<y.l2;
//}
//bool solve(){
// sort(a+1,a+1+n,cmp1);
// int p=1;
// for(int i=1;i<=n;i++){
// //printf("hi%d %d %d %d\n",i,a[i].l1,a[i].r1,a[i].id);
// if(a[p].l1<=i&&i<=a[p].r1) x[a[p++].id]=i;
// else if(a[p].r1<i||a[p].l1>i) return 0;
// }
//
// sort(a+1,a+1+n,cmp2);
// p=1;
// for(int i=1;i<=n;i++){
// //printf("ih%d %d %d %d\n",i,a[i].l2,a[i].r2,a[i].id);
// if(a[p].l2<=i&&i<=a[p].r2) y[a[p++].id]=i;
// else if(a[p].r2<i||a[p].l2>i) return 0;
// }
// return 1;
//}
bool sol(){
memset(x,,sizeof(x));
memset(y,,sizeof(y));
for(int i=;i<=n;i++){
int rook=,mnr=INF;
for(int j=;j<=n;j++)
if(!x[j]&&a[j].l1<=i&&a[j].r1<mnr) rook=j,mnr=a[j].r1;
//printf("rook1 %d\n",rook);
if(rook==||a[rook].r1<i) return false;
x[rook]=i;
}
for(int i=;i<=n;i++){
int rook=,mnr=INF;
for(int j=;j<=n;j++)
if(!y[j]&&a[j].l2<=i&&a[j].r2<mnr) rook=j,mnr=a[j].r2;
//printf("rook2 %d\n",rook);
if(rook==||a[rook].r2<i) return false;
y[rook]=i;
}
return ;
}
int main(int argc, const char * argv[]) {
while((n=read())){
for(int i=;i<=n;i++){
a[i].id=i;
a[i].l1=read();a[i].l2=read();a[i].r1=read();a[i].r2=read();
}
if(sol()){
for(int i=;i<=n;i++) printf("%d %d\n",x[i],y[i]);
}else printf("IMPOSSIBLE\n");
} return ;
}

UVA - 11134 Fabled Rooks[贪心 问题分解]的更多相关文章

  1. UVA 11134 Fabled Rooks 贪心

    题目链接:UVA - 11134 题意描述:在一个n*n(1<=n<=5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案 ...

  2. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  3. UVa 11134 - Fabled Rooks——[问题分解、贪心法]

    We would like to place n rooks, ≤ n ≤ , on a n × n board subject to the following restrictions • The ...

  4. uva 11134 - Fabled Rooks(问题转换+优先队列)

    题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...

  5. UVa 11134 Fabled Rooks (贪心+问题分解)

    题意:在一个n*n的棋盘上放n个车,让它们不互相攻击,并且第i辆车在给定的小矩形内. 析:说实话,一看这个题真是没思路,后来看了分析,原来这个列和行是没有任何关系的,我们可以分开看, 把它变成两个一维 ...

  6. UVA - 11134 Fabled Rooks问题分解,贪心

    题目:点击打开题目链接 思路:为了满足所有的车不能相互攻击,就要保证所有的车不同行不同列,于是可以发现,行与列是无关的,因此题目可以拆解为两个一维问题,即在区间[1-n]之间选择n个不同的整数,使得第 ...

  7. uva 11134 fabled rooks (贪心)——yhx

    We would like to place n rooks, 1 n 5000, on a n nboard subject to the following restrictions• The i ...

  8. UVa 11134 - Fabled Rooks 优先队列,贪心 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  9. UVA 11134 Fabled Rooks(贪心的妙用+memset误用警示)

    题目链接: https://cn.vjudge.net/problem/UVA-11134 /* 问题 输入棋盘的规模和车的数量n(1=<n<=5000),接着输入n辆车的所能在的矩阵的范 ...

随机推荐

  1. webapi swagger自定义 HTTP Header验证用户

    问题描述 webapi自定义的一种验证方式(token放入header里),使用swagger测试时由于header里没值所以一直拿不到用户. 解决如下:(从标题2开始,标题1处处理全局验证用户) 1 ...

  2. js设置、获取单值cookie和多值cookie

    js设置.获取单值cookie和多值cookie,代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值coo ...

  3. UDS(ISO14229-2006) 汉译(No.7 应用层协议)【未完,待续】

    7.1定义 应用层协议通常作为确认消息的传输,意味着从客户端发送的每一个请求都将有由服务器端产生的与之相对的响应. 唯一的例外在于:例如使用了功能寻址方式,或者该请求/指示没有指定生成响应/确定的少数 ...

  4. No.009:Palindrome Number

    问题: Determine whether an integer is a palindrome. Do this without extra space. 官方难度: Easy 翻译: 不使用额外空 ...

  5. 除去String字符串里面指定的字符串

    主要用到String的两个方法,分别是subString(int len)或subString(int start,int end)和str.indexOf(String str1) 思路:先判断指定 ...

  6. Entity Framework 中的Code First 中引入数据库函数

    1,在项目中添加CodeFirstStoreFunctions包: Install-Package EntityFramework.CodeFirstStoreFunctions 2,注册注册函数,F ...

  7. MVC中实现Area几种方法

    概述        ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...

  8. JQuery实现一个简单的鼠标跟随提示效果

    效果体验:http://hovertree.com/texiao/jsstudy/2/ 实现思路 1 鼠标移入标题(这里是<a>标签) 创建一个div,div的内容为鼠标位置的文本 将创建 ...

  9. JS如何禁止别人查看网站源码

    四种查看路径: 查看效果:猛戳 1.直接按F12 2.Ctrl+Shift+I查看 3.鼠标点击右键查看 4.Ctrl+u=view-source:+url 把以上三种状态都屏蔽掉就可以了,docum ...

  10. SharePoint 2013 托管导航及相关配置 <二>

    本文的思路是使用JQuery重写SharePoint自带托管导航的样式,其实思路和脚本都非常简单,引用一下JQuery脚本,然后重写导航的样式,把脚本放到母版页中,即可.当然,使用JQuery可以做很 ...