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 ;