数独

data tmp001( keep = r c n ) ;
  format r c n ;
  array ary{9} ;
  input ary{*} ;
  do c = 1 to 9 ;
    r = _n_ ;
    n = ary[c] ;
    output ;
  end ;
  datalines ;
0 3 0 0 2 0 0 1 0
7 0 0 8 0 3 0 0 2
0 0 0 6 0 9 0 0 0
0 6 1 0 0 0 5 3 0
0 0 0 4 0 6 0 0 0 
0 7 5 0 0 0 4 8 0
0 0 0 1 0 2 0 0 0
6 0 0 7 0 8 0 0 3
0 4 0 0 9 0 0 2 0
;
run ;

proc optmodel ;
  set < num , num , num > idx ;
  read data tmp001 into idx = [ r c n ] ;
  var xVar{ 1..9 , 1..9 , 1..9 } binary ;
  con001{ i in 1..9 , j in 1..9 } : sum{ k in 1..9 } xVar[ i , j , k ] = 1 ;
  con002{ j in 1..9 , k in 1..9 } : sum{ i in 1..9 } xVar[ i , j , k ] = 1 ;
  con003{ k in 1..9 , i in 1..9 } : sum{ j in 1..9 } xVar[ i , j , k ] = 1 ;
  con004{ ii in 1..3 , jj in 1..3 , k in 1..9 }
    : sum{ i in ( -2 + 3 * ii )..( 3 * ii ) , j in ( -2 + 3 * jj )..( 3 * jj ) } xVar[ i , j , k ] = 1 ;
  con005{ < i , j , k > in idx : k ne 0 } : xVar[ i , j , k ] = 1 ;
  solve with clp / FindAll ;
  create data tmp002 from [ r c n ] xVar ;
quit ;

proc transpose 
  data = tmp002( where = ( xVar = 1 ) )
  out  = tmp003( drop = r _NAME_ ) ;
  by r ;
  id c ;
  var n ;
run ;