Main algorithm Input: Board B, Rack R M := possibleMoves(B,R) K := the 10 best m in M w.r.t. value(B,R,m) [ K := K + andere Kandidaten ] for k in K do B' := B with k; Vop := 0; for i := 1 to 1000 do Rop := random choice from remaining letters; Mop := possibleMoves(B',Rop); Vop := Vop + max{value(B',Rop,mop) | mop in Mop}; od k.value := value(B,R,k) - (Vop / 1000); od Output: k in K mit k.value maximal =================================================== possibleMoves(board B, rack R): for each square s on B where a new word may start do extend("", s, initNode of word trie) extend(word, s, N): if s is vacant then if N is terminal node then output(word) fi; for each edge (N,N') do l := label of edge (N,N'); if l on R and l in chross check set of s then remove a tile l from R; s' := square right of s; extend(word+l, s', N'); put l back on R; fi od else l := s.letter; for each edge (N,N') that is labelled with l do s' := square right of s; extend(word+l, s', N'); od fi