我正在尝试在perl中编写8皇后问题,而我似乎遇到了无法修复的无限循环。我认为问题在于女王的增量,因为当我打印“$ queen”时;在我的求解函数中,我得到的是一堆1。
#
# implement 8 queen problem
#
my $size = 8;
my @answer = ();
sub is_conflict($$){
my ($row, $queen) = @_;
for(my $i=0; $i<$queen; $i=$i+1){
my $temp = $answer[$i];
if (($temp eq $row) or #same row
($temp eq ($row - ($queen - $i))) or #same diagonal
($temp eq ($row + ($queen-$i)))){ #same diagonal
return 1; #return true
}
}
return 0; #return false
}
sub solve($){
my $queen = @_;
if($queen eq $size){
print "@answer\n";
@answer = ();
}
else{
for(my $i=0; $i<$size; $i=$i+1){
if(is_conflict($i,$queen) eq 0){
push(@answer, $i);
solve($queen+1);
}
}
}
}
solve(0);
答案 0 :(得分:3)
my $queen = @_
几乎肯定不是你的意思。
my $var = @_
evaluates @_
in scalar context,为您提供@_
的大小,而不是@_
的第一个元素。在您的计划中,您始终将值1
分配给$queen
。
相反,你想说一个
my ($queen) = @_; # list context, assigns first element of @_
my $queen = shift @_; # extract first element from @_
my $queen = shift; # inside a sub, same as shift @_