uva 11134——Fabled Rooks

题意:给定一个n*n的期棋盘放n个车,要求任意车之间不能相互攻击,并且每个车都在相应的方框内。


思路:贪心。因为没有对角线的条件约束,所以放的行号和列号没有影响。那么单独求出来行号和列号即可。对于每一行,如果能往上放,贪心得到行号,同样的方法在得到列号。


code:

#include <cstdio>
#include <cstring>
using namespace std;

const int N=5005;
int n,x1[N],x2[N],y2[N],y1[N],x[N],y[N];

int sol(int *a,int *b,int *s)
{
	memset(s,-1,n*sizeof(int));
	for (int c=1;c<=n;c++)
	{
		int tk=-1,mb=n+1;
		for (int i=0;i<n;i++)
		if (s[i]<0&&b[i]<mb&&c>=a[i]){tk=i;mb=b[i];}
	    if (tk<0||c>mb) return 0;
		s[tk]=c;
	}
	return 1;
}
int main()
{
	while (~scanf("%d",&n)&&n)
	{
		for (int i=0;i<n;i++)
			scanf("%d %d %d %d",&x1[i],&y1[i],&x2[i],&y2[i]);
		if (sol(x1,x2,x)&&sol(y1,y2,y))
			for (int i=0;i<n;i++) printf("%d %d\n",x[i],y[i]);
		else puts("IMPOSSIBLE");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值