2017-05-31 15 views
0

私はperlで8クイーンの問題をコードしようとしています。私は修正できない無限ループに陥っているようです。私は問題がクイーンインクリメントであると思います。なぜなら私が "$ queen"を印刷するときです。私の解決機能で私が得るのは1の束です。私のperlプログラムは無限ループ(クイーン8)

# 
# 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); 
+1

の1を言いたい:プロトタイプを使用しないでください。彼らはあなたが思うことはしません。 '($)'を失う。 – Sobrique

答えて

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 @_ 
+0

私は$ queen = @_が変数を渡していると仮定していました。今私は無限ループはありませんが、私のプログラムはまだ何も出力しません。 –

関連する問題