/** čĊ Ġ* ĠMIT ĠLicense čĊ Ġ* čĊ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠCur tis ĠS . ĠC ooper čĊ Ġ* čĊ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy čĊ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal čĊ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights čĊ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell čĊ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis čĊ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : čĊ Ġ* čĊ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall čĊ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . čĊ Ġ* čĊ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR čĊ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , čĊ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE čĊ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER čĊ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , čĊ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE čĊ Ġ* ĠSOFTWARE . čĊ Ġ*/ č Ċ package Ġus . csc . que ens čĊč Ċ import Ġjava . time . LocalDateTime č Ċ import Ġjava . time . format . DateTime Formatter čĊč Ċ private Ġenum Ġclass ĠArg List ( val Ġcli Arg : ĠString ) Ġ{ čĊĠĠĠ ĠCO RES ("-- cores "), čĊĠĠĠ ĠHEL P ("-- help "), čĊĠĠĠ ĠMODE ("-- mode "), čĊĠĠĠ ĠSIZE ("-- size "), čĊĠĠĠ ĠVERSION ("-- version "); č Ċ } čĊč Ċ private Ġval ĠUS AGE : ĠString Ġ= Ġ""" * ĠN - Que ens , Ġv . Ġ$ N QUE ENS _ VERSION č Ċ Usage : čĊĠ Ġ-- cores Ġ< # >: Ġspecify Ġthe Ġnumber Ġof ĠCPU Ġcores ; Ġmust Ġbe Ġ>= Ġ 1 ; Ġthe Ġdefault Ġis Ġ 1 Ġif Ġnot Ġspecified . čĊĠ Ġ-- help : Ġprints Ġthis Ġhelp Ġmessage Ġand Ġexits . čĊĠ Ġ-- mode Ġ< MODE >: Ġspecify Ġthe Ġprogram Ġmode . Ġ ĠCho ices Ġfor Ġthe ĠMODE Ġparameter Ġinclude : čĊĠĠĠ Ġbenchmark Ġ- ĠCount Ġthe Ġsolutions Ġalong Ġwith Ġtime Ġspent ; Ġused Ġto Ġmeasure ĠCPU Ġperformance . čĊĠĠĠ Ġfirst Ġ- ĠPrint Ġthe Ġfirst Ġsolution Ġand Ġexit ; Ġuseful Ġto Ġsee Ġa Ġsolution Ġof Ġvery Ġlarge Ġboards . čĊĠĠĠ Ġtrace : Ġprint Ġa Ġtrace Ġof Ġthe Ġalgorithm Ġstep - by - step , Ġas Ġwell Ġas Ġthe Ġsolutions . čĊĠĠĠ Ġview : Ġprint Ġall Ġsolutions Ġof Ġthe ĠN - Queen Ġproblem Ġfor Ġthe Ġgiven Ġboard Ġsize . čĊĠ Ġ-- size Ġ< # >: Ġspecify Ġthe Ġsize Ġof Ġthe Ġboard ; Ġmust Ġbe Ġ>= Ġ 1 ; Ġthe Ġdefault Ġis Ġ 8 . čĊĠ Ġ-- version : Ġprints Ġthe Ġversion Ġof Ġthe Ġprogram Ġand Ġexits . čĊč Ċ Example : čĊĠ Ġ> Ġjava Ġ- jar Ġbin / n - que ens -$ N QUE ENS _ VERSION . jar Ġ-- mode Ġbenchmark Ġ-- size Ġ 1 4 čĊĠ ĠCount s Ġall Ġsolutions Ġto Ġthe ĠN - Que ens Ġproblem Ġfor Ġa Ġ 1 4 x 1 4 Ġche ss Ġboard . č Ċ """ čĊč Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ čĊĠĠĠ Ġif Ġ( args . isEmpty () Ġ|| Ġ! args . contains ( Arg List . MODE . cli Arg )) Ġ{ čĊĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġvar Ġboard Size : ĠByte Ġ= ĠREG ULAR _ CH ESS _ BOARD _ SIZE čĊĠĠĠ Ġvar Ġnum Threads Ġ= Ġ 1 čĊĠĠĠ Ġvar Ġtrace Steps Ġ= Ġfalse čĊĠĠĠ Ġvar Ġprint Solutions Ġ= Ġfalse čĊĠĠĠ Ġvar Ġstop After First Ġ= Ġfalse čĊčĊĠĠĠ Ġvar Ġarg Index Ġ= Ġ 0 čĊĠĠĠ Ġwhile Ġ( arg Index Ġ< Ġargs . size ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs [ arg Index ]. toLowerCase () čĊĠĠĠĠĠĠĠ Ġwhen Ġ( arg ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg List . SIZE . cli Arg Ġ-> Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboard Size Ġ= Ġargs [++ arg Index ]. to Byte () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg List . CO RES . cli Arg Ġ-> Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Threads Ġ= Ġargs [++ arg Index ]. toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠArg List . MODE . cli Arg Ġ-> Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġargs [++ arg Index ]. toLowerCase () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" benchmark " Ġ-> Ġprint Solutions Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" first " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop After First Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Solutions Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" trace " Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Steps Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Solutions Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" view " Ġ-> Ġprint Solutions Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( arg ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArg List . HELP . cli Arg Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArg List . VERSION . cli Arg Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" N - Que ens , Ġv . Ġ$ N QUE ENS _ VERSION ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( USAGE ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ++ arg Index čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġrun Solver ( board Size , Ġnum Threads , Ġtrace Steps , Ġprint Solutions , Ġstop After First ) č Ċ } čĊč Ċ internal Ġfun ĠgetTime DateString ( dateTime : ĠLocalDateTime ): ĠString Ġ{ čĊĠĠĠ Ġreturn ĠdateTime . format ( DateTime Formatter . of Pattern (" MMM Ġd Ġy yyy Ġhh : mm : ss Ġa ")) č Ċ } čĊč Ċ private Ġfun Ġrun Solver ( board Size : ĠByte , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Threads : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Steps : ĠBoolean , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Solutions : ĠBoolean , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop After First : ĠBoolean ) Ġ{ čĊĠĠĠ Ġprintln ( getTime DateString ( LocalDateTime . now ())) čĊĠĠĠ Ġprintln (" Sol ving Ġa Ġ${ board Size } x ${ board Size } Ġboard ; Ġ# Ġthreads Ġ= Ġ$ num Threads :\ n ") čĊčĊĠĠĠ Ġvar Ġsolver Result Ġ= ĠSolve Result () čĊĠĠĠ Ġrun Ġ{ čĊĠĠĠĠĠĠĠ Ġval ĠstartTime : ĠLong Ġ= ĠSystem . nano Time () čĊĠĠĠĠĠĠĠ Ġsolver Result Ġ= Ġsolve NQ ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġboard Size Ġ= Ġboard Size , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Threads Ġ= Ġnum Threads , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Steps Ġ= Ġtrace Steps , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Solution Only Ġ= Ġstop After First , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Solutions Ġ= Ġfalse , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Solutions Ġ= Ġprint Solutions ) čĊĠĠĠĠĠĠĠ Ġval ĠendTime : ĠLong Ġ= ĠSystem . nano Time () čĊčĊĠĠĠĠĠĠĠ Ġval Ġduration : ĠDouble Ġ= Ġ( endTime Ġ- ĠstartTime ). toDouble () Ġ/ Ġ 1 . 0 e 9 čĊĠĠĠĠĠĠĠ Ġval Ġduration Str Ġ= ĠString . format ("% . 3 g ", Ġduration ) čĊĠĠĠĠĠĠĠ Ġprintln ("\ n Time Ġto Ġsolve : Ġ$ duration Str Ġ[ s ]") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprintln (" Total Ġsolutions Ġfound Ġ= Ġ${ solver Result . num Solutions }") čĊĠĠĠ Ġprintln ( getTime DateString ( LocalDateTime . now ())) č Ċ } čĊĠ