#!/usr/bin/perl

  my %columns = ();   # columns for dancing.
  my %npcolumns = ();   # non-primary columns for dancing.

$grid1 = 
#"62..3....8.....3.9...29...8......7....6.83.522.497....1..3...8..5..4..3..9..2.5..";
#"6..4...2...3......5..82.3.11..5....37.6..2.5....3.6..7259...1.....64..3....2....5";
#".6..3.81......7...2.86....3...51..4.35.7..1...9..2.5....7.8..95..69.......3.7...8";
#"..137..2..47..5.169..1...7.57..631....9...7....879..42.1...9..783.4..65..9..524..";
#"1.732...853.....27...74..3...16.7...2.3..9751.8.2...4.3....6...85..94.76..9..25.4";
#".5.....38..3921..4..7......1....36.9.7.2.....5..46..1..8..9.1..6..1.....2..7..5.6";
"1.2..5.96...4...5..8..1....3....9.2.9..824.1..5....7..4..6..1....3.4....7...8.4.5";
for $val (0..80) {
  $row = (int ($val / 9)) + 1;
  $col = $val % 9 + 1;
  $given{1}{$row}{$col} = substr $grid1, $val, 1;
}

for $row (1..9) {
for $col (1..9) {
print $given{1}{$row}{$col};
} print "\n";
} print "\n";

$grid = 1;
  for $row (1..9) {
    for $col (1..9) {
      for $num (1..9) {
        @fodder = ();

        if ('.' ne $given{$grid}{$row}{$col} and 
             "$num" ne $given{$grid}{$row}{$col}) {
          next;
        }

        push @fodder, "G${grid}R${row}C${col}";
        push @fodder, "G${grid}R${row}N${num}";
        push @fodder, "G${grid}C${col}N${num}";
        $area = int(($row-1)/3)*3 + int(($col-1)/3) + 1;
        push @fodder, "G${grid}A${area}N${num}";
        push @fodder, "R${row}C${col}N${num}";
        $columns{"G${grid}R${row}C${col}"} = 1;
        $columns{"G${grid}R${row}N${num}"} = 1;
        $columns{"G${grid}C${col}N${num}"} = 1;
        $columns{"G${grid}A${col}N${num}"} = 1;
        $npcolumns{"R${row}C${col}N${num}"} = 1;
    

        push @lines, (join ' ', @fodder);
      }
    }
  }

  unshift @lines, (join " ", (sort keys %columns), "|", (sort keys %npcolumns));

  open FHAND, ">tempfile";
  print FHAND (join "\n", @lines);
  print FHAND "\n";
  close FHAND;

  print "tempfile written\n";

  open FHAND, "./dance3 1 <tempfile |";

  while ($line = <FHAND>) {
    chomp $line;
    if ($line =~ /G(\d)R(\d)C(\d)/) {
      my $g = $1;
      my $r = $2;
      my $c = $3;
      $line =~ /G(\d)R(\d)N(\d)/;
      my $n = $3; 
      $sol[$g][$r][$c] = $n;
    } elsif ($line =~ /\:/) {

for $grid (1..1) {
  for $row (1..9) {
    for $col (1..9) {
      print $sol[$grid][$row][$col];
      print " " if (($col % 3) == 0);
    }
    print "\n" if (($row % 3) == 0);
    print "\n";
  }
  print "\n";
}
print "\n";
    }
  }

  close FHAND;
  

for $grid (1..1) {
  for $row (1..9) {
    for $col (1..9) {
      print $sol[$grid][$row][$col];
      print " " if ($col % 3 == 0);
    }
    print "\n";
    print "\n" if ($row % 3 == 0);
  }
  print "\n";
}
