贪心 uvaoj 11134 Fabled Rooks
Problem F: Fabled Rooks
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 rectangle 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.
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.
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
- 1 1 2 2
- 5 7 8 8
- 2 2 5 5
- 2 2 5 5
- 6 3 8 6
- 6 3 8 5
- 6 3 8 8
- 3 6 7 8
- 8
- 1 1 2 2
- 5 7 8 8
- 2 2 5 5
- 2 2 5 5
- 6 3 8 6
- 6 3 8 5
- 6 3 8 8
- 3 6 7 8
- 0
Output for sample input
- 1 1
- 5 8
- 2 4
- 4 2
- 7 3
- 8 5
- 6 6
- 3 7
- 1 1
- 5 8
- 2 4
- 4 2
- 7 3
- 8 5
- 6 6
- 3 7
对于一个N*N的棋盘,求放置N个有放置范围的车的一种方案,要求车不能相互攻击。
这题有一个很巧妙的性质:行和列是不相关联的,考虑处理两次,贪心即可。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- const int maxn=;
- int L[maxn],R[maxn],U[maxn],D[maxn],P[maxn];
- int X[maxn],Y[maxn];
- bool cmp1(int a,int b){
- if(R[a]!=R[b])return R[a]<R[b];
- return L[a]<L[b];
- }
- bool cmp2(int a,int b){
- if(D[a]!=D[b])return D[a]<D[b];
- return U[a]<U[b];
- }
- bool vis[maxn];
- int main(){
- int n,cnt;
- while(~scanf("%d",&n)&&n){
- for(int i=;i<=n;i++)
- scanf("%d%d%d%d",&U[i],&L[i],&D[i],&R[i]);
- for(int i=;i<=n;i++)P[i]=i;
- bool OK=true,flag;
- sort(P+,P+n+,cmp1);
- memset(vis,,sizeof(vis));cnt=;
- for(int i=,j;i<=n;i++){
- while(vis[P[cnt]])cnt++;flag=false;
- for(j=cnt;j<=n;j++)
- if(!vis[P[j]]&&i<=R[P[j]]&&i>=L[P[j]]){
- flag=true;
- break;
- }
- OK&=flag;
- if(!OK)break;
- Y[P[j]]=i;
- vis[P[j]]=true;
- }
- sort(P+,P+n+,cmp2);
- memset(vis,,sizeof(vis));cnt=;
- for(int i=,j;i<=n;i++){
- while(vis[P[cnt]])cnt++;flag=false;
- for(j=cnt;j<=n;j++)
- if(!vis[P[j]]&&i<=D[P[j]]&&i>=U[P[j]]){
- flag=true;
- break;
- }
- OK&=flag;
- if(!OK)break;
- X[P[j]]=i;
- vis[P[j]]=true;
- }
- if(OK){
- for(int i=;i<=n;i++)
- printf("%d %d\n",X[i],Y[i]);
- }
- else
- printf("IMPOSSIBLE\n");
- }
- return ;
- }
贪心 uvaoj 11134 Fabled Rooks的更多相关文章
- UVA - 11134 Fabled Rooks[贪心 问题分解]
UVA - 11134 Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n × n board subject to t ...
- uva 11134 - Fabled Rooks(问题转换+优先队列)
题目链接:uva 11134 - Fabled Rooks 题目大意:给出n,表示要在n*n的矩阵上放置n个车,并且保证第i辆车在第i个区间上,每个区间给出左上角和右小角的坐标.另要求任意两个车之间不 ...
- 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 ...
- UVA 11134 - Fabled Rooks(贪心+优先队列)
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
- UVa 11134 - Fabled Rooks 优先队列,贪心 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa 11134 Fabled Rooks(贪心)
题目链接 题意 在n*n的棋盘上的n个指定区间上各放1个'车’ , 使他们相互不攻击(不在同行或同列),输出一种可能的方法. 分析 每行每列都必须放车,把行列分开看,若行和列同时有解,则问题有解. ...
- UVA 11134 Fabled Rooks(贪心的妙用+memset误用警示)
题目链接: https://cn.vjudge.net/problem/UVA-11134 /* 问题 输入棋盘的规模和车的数量n(1=<n<=5000),接着输入n辆车的所能在的矩阵的范 ...
- UVa 11134 Fabled Rooks (贪心+问题分解)
题意:在一个n*n的棋盘上放n个车,让它们不互相攻击,并且第i辆车在给定的小矩形内. 析:说实话,一看这个题真是没思路,后来看了分析,原来这个列和行是没有任何关系的,我们可以分开看, 把它变成两个一维 ...
- UVA 11134 Fabled Rooks 贪心
题目链接:UVA - 11134 题意描述:在一个n*n(1<=n<=5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案 ...
随机推荐
- 阿里大于验证码发送 (ThinkPhp框架)
1.登录平台 阿里大于2.登陆之后我们可以看到资费,使用场景等,在进入正题之前我们需要一些准备工作,首先我们先了解下短信的请求参数,在这里我们需要注意的是sms_param这个参数,在接下来我们申请短 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- wampserver 2.4 配置虚拟主机
最近用到了wamp环境,想创建一个虚拟主机,可是忘记了,于是百度了一下,把它写下来: 环境wampserver 2.4 找到安装目录,进入apache安装目录:找到conf 下的 httpd.conf ...
- oracle decode函数使用方法
1.decode(V1,1,A,2,B,C) 如果V1=1 那么显示A =2显示B 其他显示C ........ 2. 含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返 ...
- Core Animation系列之CADisplayLink(转)
转自 http://www.tuicool.com/articles/meMVR3 一直以来都想好好学习下CoreAnimation,奈何涉及的东西太多,想要一次性全部搞定时间上不允许,以后会断断续续 ...
- DataSet与DataTable基本用法
http://files.cnblogs.com/files/monkeyZhong/DataSetExample.rar 在设计数据库操作或者XML操作等表格数据时,我们难免要跟DataSet和Da ...
- functools学习有感
functools的内容不多,包含四个函数(partial,reduce,update_wrapper,wraps)和一个python对象(partial Objects). functools的四个 ...
- How far away ?
#include<iostream> #include <algorithm> using namespace std; const int M=40010; int dis[ ...
- js四舍五入的bug和方法
简单来说js使用原生toFixed(x)截取小数的时候会有误差,出现在比如var o = 0.3303;o.toFixed(3);//0.330 toFixed(x)本来也是一个获取四舍五入的截取方法 ...
- PHP学习之中数组--创建数组【1】
在PHP中数组的定义有三种写法,分别是: <?php //第一种方式是用关键字 array来创建的 $username = array("demo1","demo2 ...