uva11134 相互不攻击的车

/*uva11134
在N*N(1<=N<=5000)的棋盘上放置N个车,使它们相互不攻击。
但是车有划定的区间放置。
求解一种方案,是的每个车能放置,没有一种满足,输出impossible
思路:
这种放置车的问题,一般思考到二分图最大匹配上。
因为要求出到底放置到哪个位置,所以要记录下来匹配的点。
我们发现行和列是可以分类讨论的(因为给定的区间是一个矩形,这样,即使选定了某一行放置,所有的列还是可供选择的)
整理一下流程:例如行:
对车编号1--N,对行编号1--N;
如果一个车i能放置到第j行,我们在i和j之间连一条i到j的有向边。
我们现在要找到一个最大匹配,一个匹配(即一条边)的逻辑含义是i车放在j行。
这样,我们思考匹配寻找的过程。若 1->2,1->3,1->4,2->3,2->4,2->5.
*/

 1 #include <iostream>
 2 #include <cmath>
 3 #include <algorithm>
 4 #include <string.h>
 5 #include <stdio.h>
 6 #include <set>
 7 #include <stack>
 8 #include <vector>
 9 #define maxn 5010
10 using namespace std;
11
12 int N;
13 struct Line{
14     int l,r,k;
15     bool operator<(const Line & X)const{
16         if (l==X.l) return r<X.r;else return l<X.l;
17     }
18     void print(){
19         printf("%d:[%d,%d]\n",k,l,r);
20     }
21 }X[maxn],Y[maxn];
22 int posX[maxn],posY[maxn];
23 int xl[maxn],yl[maxn],xr[maxn],yr[maxn];
24 void read(){
25     for(int i=1;i<=N;i++){
26         scanf("%d%d%d%d",&xl[i],&yl[i],&xr[i],&yr[i]);
27         X[i-1]=(Line){xl[i],xr[i],i};
28         Y[i-1]=(Line){yl[i],yr[i],i};
29     }
30 }
31 bool solveX(){
32     sort(X,X+N);
33     int p=0;
34     for(int i=1;i<=N;i++){
35         Line L=X[p];
36         L.print();
37         if(L.l<=i && L.r>=i) {
38             p++;
39             posX[L.k]=i;
40             cout<<"choose"<<i<<endl;
41         }else return false;
42     }
43     return true;
44 }
45 bool solveY(){
46     sort(Y,Y+N);
47     int p=0;
48     for(int i=1;i<=N;i++){
49         Line L=Y[p];
50         if (L.l<=i && L.r>=i) {
51             p++;
52             posY[L.k]=i;
53         }else return false;
54     }
55     return true;
56 }
57 void printans(){
58     for(int i=1;i<=N;i++){
59         printf("%d %d\n",posX[i],posY[i]);
60     }
61     return ;
62 }
63 int main(){
64     while(~scanf("%d",&N) && N>0){
65         read();
66         if (solveX() && solveY()) printans();
67         else printf("IMPOSSIBLE\n");
68     }
69     return 0;
70 }

uva11134 相互不攻击的车

时间: 2024-10-31 04:09:47

uva11134 相互不攻击的车的相关文章

车的放置

问题描述 有下面这样的一个网格棋盘,a,b,c,d表示了对应边长度,也就是对应格子数. 要在这个棋盘上放K个相互不攻击的车,也就是这K个车没有两个车在同一行,也没有两个车在同一列,问有多少种方案.同样只需要输出答案mod 100003后的结果. 输入格式 输入文件place.in的第1行为有5个非负整数a, b, c, d和k. 输出格式 输出文件place.out包括1个正整数,为答案mod 100003后的结果. 样例输入 2 2 2 2 2 样例输出 38 题解 设f[i][j]表示前i行

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选

UVa 11134 Fabled Rooks(贪心)

题意  在n*n的棋盘上的n个指定区间上各放1个'车'  使他们相互不攻击   输出一种可能的方法 行和列可以分开看  就变成了n个区间上选n个点的贪心问题  看行列是否都有解就行   基础的贪心问题  对每个点选择包含它的最优未使用空间 #include <bits/stdc++.h> using namespace std; const int N = 5005; int xl[N], yl[N], xr[N], yr[N], x[N], y[N], n; bool solve(int a

ACM 算法实现

实验一 统计数字问题 1.问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9.2.题目分析:考虑由0,1,2,…,9组成的所有n位数.从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为. 满足如下递归式:由此可知,.据此,可从低位向高位进行

初步了解--状态压缩dp---poj1185炮兵布阵结题报告

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

【CodeForces】Gargari and Bishops

根据贪心可以知道,放置的教主必须不能相互攻击到(也就是不在一条对角线上)才可以使得结果最大化. 根据观察可以得到教主相互不攻击的条件是他的坐标和互为奇偶(x + y) 之后直接暴力,处理每个坐标对角线的和就好 时间复杂度 0(n ^ 2) #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 20

清北学堂2017NOIP冬令营入学测试

P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天工作8小时,一周工作7天.小A想知道性价

poj1185炮兵布阵结题报告--初步了解--状态压缩dp

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

hdu 5180 状态压缩 dp 打表

hdu 5180 状态压缩 dp 打表 题意: 在n*n的国际象棋中,放置若干个国王和k个车,使得国王之间不互相攻击,车之间不互相攻击,车不可攻击到国王(这并不代表国王不能攻击到车).国王能攻击到它上下左右,左上左下右上右下八个位置的棋子,车可以攻击到同一行或同一列中的棋子,求方案总数对1000000007取模后的值. 限制: 1 <= n <=15; 0 <= k <=15 思路: 状态压缩,dp,打表套打表 打表程序如下: 打表程序1: tab[a][b]表示a*b的棋盘王的放