Se mi posso permettere, una possibile strategia diversa che limiterebbe i cicli for/while annidati:
fatti un array(9) di boolean inizialmente settati a false.
Man mano che scorri una riga (colonna) controlli se nell'array di boolean il posto di indice "elemento riga/colonna - 1" è false (non è ancora stato trovato) o true (è già stato trovato).
Se non fosse già stato trovato, lo setti a true. Se fosse già true vorrà dire che si tratta di un elemento duplicato.