- 论坛徽章:
- 0
|
写了个除交集的子程序,大家测试下!
#!/usr/bin/perl
use strict;
use warnings;
sub get_intersection{
# my ($s1,$e1,$s2,$e2)=@_;传递四个坐标作为参数
if ($_[1]<$_[2] || $_[0]>$_[3]) {
print "无交集!\n";
return ();
}else{
@_=sort {$a<=>$b} @_;
my @inter=($_[1],$_[2]);
delete_repeat(@inter);
}
}
sub delete_repeat{
my %h;
@h{@_}=1;
my @collet=sort {$a<=>$b} keys %h;
}
sub cut_intersection{
my @a=($_[0],$_[1]);
my @b=($_[2],$_[3]);
my @cut;
my @inter =get_intersection(@a,@b);
if (scalar @inter==1) {
$inter[0]==$a[0] ? do{ @cut=($a[0]+1,$a[1])} : do{ @cut=($a[0],$a[1]-1)};
}elsif(scalar @inter==0){@cut=@a;}
else{
if($inter[0]>$a[0] && $inter[1]<$a[1]){
@cut=([$a[0],$inter[0]-1],[$inter[1]+1,$a[1]]);
@cut=map {my @n=@$_;[delete_repeat(@n)]}@cut;
}
elsif($inter[0]>$a[0] && $inter[1]==$a[1]){
@cut=($a[0],$inter[0]-1);
@cut=delete_repeat(@cut)
}
elsif($inter[0]==$a[0] && $inter[1]<$a[1]){
@cut=($inter[1]+1,$a[1]);
@cut=delete_repeat(@cut)
}
elsif($inter[0]==$a[0] && $inter[1]==$a[1]){
@cut=();
}
}
return @cut;
}
my @a=(9,20);my @b=(14,19);
print map {"$_\t"}get_intersection(@a,@b);
print "\n------\n";
print map {"@$_\t"} cut_intersection(@a,@b); |
|