AWK
#!/usr/bin/awk -f
BEGIN {
    if (ARGC < 2) {
        print "Usage: ./nqueens.awk <board size>"
        exit 1
    }
    n = ARGV[1]
    delete ARGV[1]
    count = 0
    for (i = 0; i < n; i++) lock_col[i] = 0
    for (i = 0; i < 2 * n - 1; i++) {
        lock_ltrb[i] = 0
        lock_rtlb[i] = 0
    }
    print "Solving: n=" n
    solve(0)
    print "Result:  " count
}
function solve(row, local_count, dx, ltrb_index, rtlb_index) {
    if (row == n) {
        count++
        return
    }
    for (dx = 0; dx < n; dx++) {
        ltrb_index = dx - row + n - 1
        rtlb_index = dx + row
        if (lock_col[dx] || lock_ltrb[ltrb_index] || lock_rtlb[rtlb_index])
            continue
        lock_col[dx] = 1
        lock_ltrb[ltrb_index] = 1
        lock_rtlb[rtlb_index] = 1
        solve(row + 1)
        lock_col[dx] = 0
        lock_ltrb[ltrb_index] = 0
        lock_rtlb[rtlb_index] = 0
    }
}
Bash
#!/bin/bash
solve() {
  local row=$1
  local count=0
  if (( row == n )); then
    echo 1
    return
  fi
  for (( dx=0; dx<n; dx++ )); do
    local ltrb_index=$((dx-row+n-1))
    local rtlb_index=$((dx+row))
    if (( lock_col[dx] == 1 || ltrb_index < 0 || ltrb_index >= 2*n-1 || rtlb_index < 0 || rtlb_index >= 2*n-1 || lock_ltrb[ltrb_index] == 1 || lock_rtlb[rtlb_index] == 1 )); then
      continue
    fi
    lock_col[dx]=1
    lock_ltrb[ltrb_index]=1
    lock_rtlb[rtlb_index]=1
    count=$((count + $(solve $((row + 1)))))
    lock_col[dx]=0
    lock_ltrb[ltrb_index]=0
    lock_rtlb[rtlb_index]=0
  done
  echo $count
}
if (( $# < 1 )); then
  echo "Usage: $0 <board size>"
  exit 1
fi
n=$1
lock_col=($(for ((i=0; i<n; i++)); do echo 0; done))
lock_ltrb=($(for ((i=0; i<2*n-1; i++)); do echo 0; done))
lock_rtlb=($(for ((i=0; i<2*n-1; i++)); do echo 0; done))
echo "Solving: n=$n"
result=$(solve 0)
echo "Result:  $result"
C
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int n = 10;
int count = 0;
void solve(int row, bool* lockCol, bool* lockLtrb, bool* lockRtlb) {
    if (row < n) {
        for (int dx = 0; dx < n; dx++) {
            if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                continue;
            }
            lockCol[dx] = true;
            lockLtrb[dx - row + n - 1] = true;
            lockRtlb[dx + row] = true;
            solve(row + 1, lockCol, lockLtrb, lockRtlb);
            lockCol[dx] = false;
            lockLtrb[dx - row + n - 1] = false;
            lockRtlb[dx + row] = false;
        }
    } else {
        count++;
    }
}
int main(int argc, char* argv[]) {
    if (argc != 2) {
        printf("Usage: NQueens <board_size>\n");
        return 1;
    }
    // Convert input to integer and validate
    char* end;
    n = strtol(argv[1], &end, 10);
    if (*end != '\0' || n <= 0) {
        printf("Invalid input! Board size must be a positive integer!\n");
        return 1;
    }
    printf("Solving: n=%d\n", n);
    // Dynamically allocate arrays
    bool* lockCol = calloc(n, sizeof(bool));
    bool* lockLtrb = calloc(2 * n - 1, sizeof(bool));
    bool* lockRtlb = calloc(2 * n - 1, sizeof(bool));
    if (!lockCol || !lockLtrb || !lockRtlb) {
        printf("Memory allocation failed!\n");
        free(lockCol);
        free(lockLtrb);
        free(lockRtlb);
        return 1;
    }
    solve(0, lockCol, lockLtrb, lockRtlb);
    printf("Result:  %d\n", count);
    // Free allocated memory
    free(lockCol);
    free(lockLtrb);
    free(lockRtlb);
    return 0;
}
C++
#include <iostream>
#include <vector>
#include <stdexcept>
#include <string>
using namespace std;
int n = 10;
int count = 0;
void solve(int row, vector<bool>& lockCol, vector<bool>& lockLtrb, vector<bool>& lockRtlb) {
    if (row < n) {
        for (int dx = 0; dx < n; dx++) {
            if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                continue;
            }
            lockCol[dx] = true;
            lockLtrb[dx - row + n - 1] = true;
            lockRtlb[dx + row] = true;
            solve(row + 1, lockCol, lockLtrb, lockRtlb);
            lockCol[dx] = false;
            lockLtrb[dx - row + n - 1] = false;
            lockRtlb[dx + row] = false;
        }
    } else {
        count++;
    }
}
int main(int argc, char* argv[]) {
    if (argc != 2) {
        cout << "Usage: NQueens <board_size>" << endl;
        return 1;
    }
    try {
        n = stoi(argv[1]);
    } catch (invalid_argument&) {
        cout << "Invalid input! Board size must be a positive integer!" << endl;
        return 1;
    } catch (out_of_range&) {
        cout << "Invalid input! Board size is out of range!" << endl;
        return 1;
    }
    if (n <= 0) {
        cout << "Invalid input! Board size must be a positive integer!" << endl;
        return 1;
    }
    cout << "Solving: n=" << n << endl;
    vector<bool> lockCol(n, false);
    vector<bool> lockLtrb(2 * n - 1, false);
    vector<bool> lockRtlb(2 * n - 1, false);
    solve(0, lockCol, lockLtrb, lockRtlb);
    cout << "Result:  " << count << endl;
    return 0;
}
C#
using System;
public class NQueens
{
    private static int n = 10;
    private static int count = 0;
    public static void Main(string[] args)
    {
        if (args.Length != 1)
        {
            Console.WriteLine("Usage: NQueens <board_size>");
            return;
        }
        try
        {
            n = int.Parse(args[0]);
        }
        catch (FormatException)
        {
            Console.WriteLine("Invalid input! Board size must be a positive integer!");
            return;
        }
        if (n <= 0)
        {
            Console.WriteLine("Invalid input! Board size must be a positive integer!");
            return;
        }
        Console.WriteLine($"Solving: n={n}");
        Solve(0, new bool[n], new bool[2 * n - 1], new bool[2 * n - 1]);
        Console.WriteLine($"Result:  {count}");
    }
    private static void Solve(int row, bool[] lockCol, bool[] lockLtrb, bool[] lockRtlb)
    {
        if (row < n)
        {
            for (int dx = 0; dx < n; dx++)
            {
                if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row])
                {
                    continue;
                }
                lockCol[dx] = true;
                lockLtrb[dx - row + n - 1] = true;
                lockRtlb[dx + row] = true;
                Solve(row + 1, lockCol, lockLtrb, lockRtlb);
                
                lockCol[dx] = false;
                lockLtrb[dx - row + n - 1] = false;
                lockRtlb[dx + row] = false;
            }
        }
        else
        {
            count++;
        }
    }
}
CoffeeScript
n = 8
count = 0
solve = (row, lock_col, lock_ltrb, lock_rtlb) ->
  if row >= n
    count++
    return
  
  for dx in [0..n-1]
    if lock_col[dx] or lock_ltrb[dx - row + n - 1] or lock_rtlb[dx + row]
      continue
    
    lock_col[dx] = true
    lock_ltrb[dx - row + n - 1] = true
    lock_rtlb[dx + row] = true
    
    solve(row + 1, lock_col, lock_ltrb, lock_rtlb)
    
    lock_col[dx] = false
    lock_ltrb[dx - row + n - 1] = false
    lock_rtlb[dx + row] = false
main = ->
  args = process.argv[2..]
  if args.length != 1
    console.log "Usage: coffee nqueens <board_size>"
    process.exit 1
  try
    n = parseInt(args[0], 10)
  catch error
    console.log "Invalid input! Board size must be a positive integer!"
    process.exit 1
  if isNaN(n) or n <= 0
    throw new Error("Invalid input! Board size must be a positive integer!")
  lock_col = Array(n).fill(false)
  lock_ltrb = Array(n * 2 - 1).fill(false)
  lock_rtlb = Array(n * 2 - 1).fill(false)
  
  console.log "Solving: n=#{n}"
  solve(0, lock_col, lock_ltrb, lock_rtlb)
  console.log "Result:  #{count}"
main()
D
import std.stdio;
import std.conv;
import std.exception;
int n;
int count;
void solve( int row, bool[] lockCol, bool[] lockTlbr, bool[] lockTrbl ) {
    if ( row < n ) {
        for ( int dx = 0; dx < n; dx++ ) {
            if ( lockCol[dx] || lockTlbr[dx - row + n - 1] || lockTrbl[dx + row] ) {
                continue;
            }
            lockCol[dx] = true;
            lockTlbr[dx - row + n - 1] = true;
            lockTrbl[dx + row] = true;
            solve( row + 1, lockCol, lockTlbr, lockTrbl );
            lockCol[dx] = false;
            lockTlbr[dx - row + n - 1] = false;
            lockTrbl[dx + row] = false;
        }
    } else {
        count++;
    }
}
void main( string[] args ) {
    if ( args.length != 2 ) {
        writeln( "Usage: nqueens <board_size>" );
        return;
    }
    try {
        n = to!int( args[1] );
        enforce( n > 0, "Invalid input! Board size must be a positive integer!" );
    } catch ( Exception e ) {
        writeln( e.msg );
        return;
    }
    bool[] lockCol = new bool[n];
    bool[] lockTlbr = new bool[2 * n - 1];
    bool[] lockTrbl = new bool[2 * n - 1];
    writeln( "Solving: n=", n );
    solve( 0, lockCol, lockTlbr, lockTrbl );
    writeln( "Result:  ", count );
}
Dart
import 'dart:io';
int n = 0;
int count = 0;
void solve(
    int row, List<bool> lockCol, List<bool> lockLtrb, List<bool> lockRtlb) {
  if (row < n) {
    for (int dx = 0; dx < n; dx++) {
      if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
        continue;
      }
      lockCol[dx] = true;
      lockLtrb[dx - row + n - 1] = true;
      lockRtlb[dx + row] = true;
      solve(row + 1, lockCol, lockLtrb, lockRtlb);
      lockCol[dx] = false;
      lockLtrb[dx - row + n - 1] = false;
      lockRtlb[dx + row] = false;
    }
  } else {
    count++;
  }
}
void main(List<String> args) {
  if (args.length != 1) {
    print("Usage: dart nqueens.dart <board_size>");
    return;
  }
  try {
    n = int.parse(args[0]);
    if (n <= 0) {
      throw FormatException(
          "Invalid input! Board size must be a positive integer!");
    }
  } catch (e) {
    print("Invalid input! ${e}");
    return;
  }
  var lockCol = List<bool>.filled(n, false, growable: false);
  var lockLtrb = List<bool>.filled(2 * n - 1, false, growable: false);
  var lockRtlb = List<bool>.filled(2 * n - 1, false, growable: false);
  print("Solving: n=$n");
  solve(0, lockCol, lockLtrb, lockRtlb);
  print("Result:  $count");
}
Erlang
-module(nqueens).
-export([main/1]).
main([Arg]) ->
        case catch list_to_integer(Arg) of
        N when is_integer(N), N > 0 ->
            LockCol = init_array(N, false),
            LockLtrb = init_array(2 * N - 1, false),
            LockRtlb = init_array(2 * N - 1, false),
            io:format("Solving: n=~p~n", [N]),
            Count = solve(0, N, LockCol, LockLtrb, LockRtlb),
            io:format("Result:  ~p~n", [Count]);
        _ ->
            io:format("Invalid input! Please provide a positive integer.\n")
    end;
main(_) ->
    io:format("Usage: nqueens <board_size>\n").
init_array(Size, DefaultValue) ->
    array:new(Size, {default, DefaultValue}).
solve(Row, N, LockCol, LockLtrb, LockRtlb) when Row < N ->
    lists:foldl(
        fun(Dx, Acc) ->
            case can_place(Row, Dx, N, LockCol, LockLtrb, LockRtlb) of
                true ->
                    NewLockCol = array:set(Dx, true, LockCol),
                    NewLockLtrb = array:set(Dx - Row + N - 1, true, LockLtrb),
                    NewLockRtlb = array:set(Dx + Row, true, LockRtlb),
                    Acc + solve(Row + 1, N, NewLockCol, NewLockLtrb, NewLockRtlb);
                false ->
                    Acc
            end
        end,
        0,
        lists:seq(0, N - 1)
    );
solve(_, _, _, _, _) ->
    1.
can_place(Row, Dx, N, LockCol, LockLtrb, LockRtlb) ->
    not (array:get(Dx, LockCol) orelse
         array:get(Dx - Row + N - 1, LockLtrb) orelse
         array:get(Dx + Row, LockRtlb)).
Fortran
PROGRAM nqueens
  USE ISO_FORTRAN_ENV
  IMPLICIT NONE
  INTEGER :: n, solutions, arg_count, i
  LOGICAL, ALLOCATABLE :: lock_col(:), lock_ltrb(:), lock_rtlb(:)
  CHARACTER(LEN=32) :: arg
  arg_count = COMMAND_ARGUMENT_COUNT()
  IF (arg_count /= 1) THEN
    PRINT *, "Usage: nqueens <board size>"
    STOP
  END IF
  CALL GET_COMMAND_ARGUMENT(1, arg)
  READ(arg, *) n
  IF (n <= 0) THEN
    PRINT *, "Error: Board size must be a positive integer."
    STOP
  END IF
  ALLOCATE(lock_col(n), lock_ltrb(2*n-1), lock_rtlb(2*n-1))
  lock_col = .FALSE.
  lock_ltrb = .FALSE.
  lock_rtlb = .FALSE.
  solutions = 0
  CALL solve(1, n, solutions, lock_col, lock_ltrb, lock_rtlb)
  WRITE(*, '(A,I0)') "Solving: n=", n
  WRITE(*, '(A,I0)') "Result:  ", solutions
CONTAINS
  RECURSIVE SUBROUTINE solve(row, n, solutions, lock_col, lock_ltrb, lock_rtlb)
    INTEGER, INTENT(IN) :: row, n
    INTEGER, INTENT(INOUT) :: solutions
    LOGICAL, INTENT(INOUT) :: lock_col(:), lock_ltrb(:), lock_rtlb(:)
    INTEGER :: col, ltrb_idx, rtlb_idx
    IF (row > n) THEN
      solutions = solutions + 1
      RETURN
    END IF
    DO col = 1, n
      ltrb_idx = col - row + n
      rtlb_idx = col + row - 1
      IF (.NOT. lock_col(col) .AND. .NOT. lock_ltrb(ltrb_idx) .AND. .NOT. lock_rtlb(rtlb_idx)) THEN
        lock_col(col) = .TRUE.
        lock_ltrb(ltrb_idx) = .TRUE.
        lock_rtlb(rtlb_idx) = .TRUE.
        CALL solve(row + 1, n, solutions, lock_col, lock_ltrb, lock_rtlb)
        lock_col(col) = .FALSE.
        lock_ltrb(ltrb_idx) = .FALSE.
        lock_rtlb(rtlb_idx) = .FALSE.
      END IF
    END DO
  END SUBROUTINE solve
END PROGRAM nqueens
GoLang
package main
import (
	"fmt"
	"os"
	"strconv"
)
var n int
var count int
func solve(row int, lockCol, lockLtrb, lockRtlb []bool) {
	if row < n {
		for dx := 0; dx < n; dx++ {
			if lockCol[dx] || lockLtrb[dx-row+n-1] || lockRtlb[dx+row] {
				continue
			}
			lockCol[dx] = true
			lockLtrb[dx-row+n-1] = true
			lockRtlb[dx+row] = true
			solve(row+1, lockCol, lockLtrb, lockRtlb)
			lockCol[dx] = false
			lockLtrb[dx-row+n-1] = false
			lockRtlb[dx+row] = false
		}
	} else {
		count++
	}
}
func main() {
	if len(os.Args) != 2 {
		fmt.Println("Usage: NQueens <board_size>")
		return
	}
	size, err := strconv.Atoi(os.Args[1])
	if err != nil || size <= 0 {
		fmt.Println("Invalid input! Board size must be a positive integer!")
		return
	}
	n = size
	fmt.Printf("Solving: n=%d\n", n)
	lockCol := make([]bool, n)
	lockLtrb := make([]bool, 2*n-1)
	lockRtlb := make([]bool, 2*n-1)
	solve(0, lockCol, lockLtrb, lockRtlb)
	fmt.Printf("Result:  %d\n", count)
}
Groovy
class NQueens {
    static void main(String[] args) {
        if (args.length != 1) {
            println "Usage: groovy NQueens <board_size>"
            return
        }
        int n
        try {
            n = args[0].toInteger()
            if (n <= 0) {
                throw new IllegalArgumentException("Board size must be a positive integer!")
            }
        } catch (Exception e) {
            println "Invalid input: ${e.message}"
            return
        }
        boolean[] lockCol = new boolean[n]
        boolean[] lockLtrb = new boolean[2 * n - 1]
        boolean[] lockRtlb = new boolean[2 * n - 1]
        println "Solving: n=$n"
        int count = solve(0, n, lockCol, lockLtrb, lockRtlb)
        println "Result:  $count"
    }
    static int solve(int row, int n, boolean[] lockCol, boolean[] lockLtrb, boolean[] lockRtlb) {
        if (row < n) {
            int solutions = 0
            for (int dx = 0; dx < n; dx++) {
                if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                    continue
                }
                lockCol[dx] = true
                lockLtrb[dx - row + n - 1] = true
                lockRtlb[dx + row] = true
                solutions += solve(row + 1, n, lockCol, lockLtrb, lockRtlb)
                lockCol[dx] = false
                lockLtrb[dx - row + n - 1] = false
                lockRtlb[dx + row] = false
            }
            return solutions
        } else {
            return 1
        }
    }
}
Haskell
import Control.Monad (forM)
import System.Environment (getArgs)
main :: IO ()
main = do
  args <- getArgs
  case args of
    [sizeArg] -> 
      case reads sizeArg :: [(Int, String)] of
        [(n, "")] | n > 0 -> do
          putStrLn $ "Solving: n=" ++ show n
          result <- solve 0 (replicate n False) (replicate (2 * n - 1) False) (replicate (2 * n - 1) False) n
          putStrLn $ "Result:  " ++ show result
        _ -> putStrLn "Invalid input! Board size must be a positive integer!"
    _ -> putStrLn "Usage: runhaskell nqueens.hs <board_size>"
solve :: Int -> [Bool] -> [Bool] -> [Bool] -> Int -> IO Int
solve row lockCol lockLTRB lockRTLB boardSize
  | row < boardSize = do
      results <- forM [0..boardSize-1] $ \dx -> 
        if lockCol !! dx || lockLTRB !! (dx - row + boardSize - 1) || lockRTLB !! (dx + row)
          then return 0
          else do
            let newLockCol  = updateList lockCol dx True
            let newLockLTRB = updateList lockLTRB (dx - row + boardSize - 1) True
            let newLockRTLB = updateList lockRTLB (dx + row) True
            
            solve (row + 1) newLockCol newLockLTRB newLockRTLB boardSize
      return (sum results)
  | otherwise = return 1
updateList :: [Bool] -> Int -> Bool -> [Bool]
updateList xs index newValue = take index xs ++ [newValue] ++ drop (index + 1) xs
Java
public class NQueens {
    private static int n = 10;
    private static int count = 0;
    public static void main( String[] args ) {
        if( args.length != 1 ) {
            System.out.println( "Usage: NQueens <board_size>" );
            return;
        }
        try {
            n = Integer.parseInt( args[ 0 ] );
        } catch( NumberFormatException e ) {
            System.out.println( "Invalid input! Board size must be a positive integer!" );
            return;
        }
        if( n <= 0 ) {
            System.out.println( "Invalid input! Board size must be a positive integer!" );
            return;
        }
        System.out.printf( "Solving: n=%d\n", n );
        solve( 0, new boolean[ n ], new boolean[ 2 * n - 1 ], new boolean[ 2 * n - 1 ] );
        System.out.printf( "Result:  %d\n", count );
    }
    private static void solve( int row, boolean[] lockCol, boolean[] lockLtrb, boolean[] lockRtlb ) {
        if( row < n ) {
            for( int dx = 0; dx < n; dx++ ) {
                if( lockCol[ dx ] || lockLtrb[ dx - row + n - 1 ] || lockRtlb[ dx + row ] ) {
                    continue;
                }
                lockCol[ dx ] = true;
                lockLtrb[ dx - row + n - 1 ] = true;
                lockRtlb[ dx + row ] = true;
                solve( row + 1, lockCol, lockLtrb, lockRtlb );
                lockCol[ dx ] = false;
                lockLtrb[ dx - row + n - 1 ] = false;
                lockRtlb[ dx + row ] = false;
            }
        } else {
            count++;
        }
    }
}
JavaScript
function main() {
    const args = process.argv.slice(2);
    if (args.length !== 1) {
        console.log("Usage: node nqueens.js <board_size>");
        return;
    }
    let n;
    try {
        n = parseInt(args[0], 10);
        if (isNaN(n) || n <= 0) {
            throw new Error("Board size must be a positive integer!");
        }
    } catch (error) {
        console.log("Invalid input! " + error.message);
        return;
    }
    const lockCol = Array(n).fill(false);
    const lockLtrb = Array(2 * n - 1).fill(false);
    const lockRtlb = Array(2 * n - 1).fill(false);
    
    console.log(`Solving: n=${n}`);
    const result = solve(0, n, lockCol, lockLtrb, lockRtlb);
    console.log(`Result:  ${result}`);
}
function solve(row, n, lockCol, lockLtrb, lockRtlb) {
    if (row < n) {
        let solutions = 0;
        for (let dx = 0; dx < n; dx++) {
            if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                continue;
            }
            lockCol[dx] = true;
            lockLtrb[dx - row + n - 1] = true;
            lockRtlb[dx + row] = true;
            solutions += solve(row + 1, n, lockCol, lockLtrb, lockRtlb);
            lockCol[dx] = false;
            lockLtrb[dx - row + n - 1] = false;
            lockRtlb[dx + row] = false;
        }
        return solutions;
    } else {
        return 1;
    }
}
main();
JayMo
n = 10
count = 0
If( __ARGS.len != 1 )
	Print "Usage: NQueens <board_size>"
	Return
Try
	n = __ARGS[1].toInt
	If( n <= 0 )
		Error( "Number too small", "n="+n ).throw
.catch
	Print "Invalid input! Board size must be a positive integer!"
	Return
LOCK_COL = [].init(n, false)
LOCK_TLBR = [].init(n * 2 - 1, false)
LOCK_TRBL = [].init(n * 2 - 1, false)
Print "Solving: n=" + n
this.solve( 0 )
Print "Result:  " + count
::solve( ROW )
	If( ROW < n )
		For( x = 1, x <= n, x =++ )
			If( LOCK_COL[x] || LOCK_TLBR[x - ROW + n - 1] || LOCK_TRBL[x + ROW] )
				Next
			LOCK_COL[x] = true
			LOCK_TLBR[x - ROW + n - 1] = true
			LOCK_TRBL[x + ROW] = true
			this.solve( ROW + 1 )
			LOCK_COL[x] = false
			LOCK_TLBR[x - ROW + n - 1] = false
			LOCK_TRBL[x + ROW] = false
	.else
		count =++
Julia
function main()
    n = 10
    m = Ref(0)
    if length(ARGS) == 1
        try
            n = parse(Int, ARGS[1])
        catch e
            println("Invalid input! Board size must be a positive integer!")
        end
    else
        println("Usage: julia nqueens.jl <board_size>")
        exit()
    end
    
    if n <= 0
        print("Invalid input! Board size must be a positive integer!")
        exit()
    end
    
    println( "Solving: n=", n)
    solve(0, n, falses(n), falses(n * 2 - 1), falses(n * 2 - 1), m)
    println( "Result:  ", m[])
end
function solve(row, n, lock_col, lock_ltrb, lock_rtlb, m)
    if row < n
        for dx in 1:n
            if lock_col[dx] || lock_ltrb[dx - row + n - 1] || lock_rtlb[dx + row]
                continue
            end
            
            lock_col[dx] = true
            lock_ltrb[dx - row + n - 1] = true
            lock_rtlb[dx + row] = true
 
            solve(row + 1, n, lock_col, lock_ltrb, lock_rtlb, m)
            
            lock_col[dx] = false
            lock_ltrb[dx - row + n - 1] = false
            lock_rtlb[dx + row] = false
        end
    else
        m[] += 1
    end
end
main()
Kotlin
fun main(args: Array<String>) {
    if (args.size != 1) {
        println("Usage: kotlin NQueens.kt <board_size>")
        return
    }
    val n: Int
    try {
        n = args[0].toInt()
        if (n <= 0) {
            throw IllegalArgumentException("Board size must be a positive integer!")
        }
    } catch (e: Exception) {
        println("Invalid input! ${e.message}")
        return
    }
    val lockCol = BooleanArray(n) { false }
    val lockLtrb = BooleanArray(2 * n - 1) { false }
    val lockRtlb = BooleanArray(2 * n - 1) { false }
    println( "Solving: n=$n" )
    val result = solve( 0, n, lockCol, lockLtrb, lockRtlb )
    println( "Result:  $result" )
}
fun solve( row: Int, n: Int, lockCol: BooleanArray, lockLtrb: BooleanArray, lockRtlb: BooleanArray ): Int {
    return if ( row < n ) {
        var solutions = 0
        for ( dx in 0 until n ) {
            if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                continue
            }
            lockCol[dx] = true
            lockLtrb[dx - row + n - 1] = true
            lockRtlb[dx + row] = true
            solutions += solve( row + 1, n, lockCol, lockLtrb, lockRtlb )
            lockCol[dx] = false
            lockLtrb[dx - row + n - 1] = false
            lockRtlb[dx + row] = false
        }
        solutions
    } else {
        1
    }
}
Lua
local function solve(row, n, lock_col, lock_ltrb, lock_rtlb)
    if row < n then
        for dx = 0, n-1 do
            if lock_col[dx] or lock_ltrb[dx - row + n - 1] or lock_rtlb[dx + row] then
                goto continue
            end
            lock_col[dx] = true
            lock_ltrb[dx - row + n - 1] = true
            lock_rtlb[dx + row] = true
            
            solve(row + 1, n, lock_col, lock_ltrb, lock_rtlb)
            
            lock_col[dx] = false
            lock_ltrb[dx - row + n - 1] = false
            lock_rtlb[dx + row] = false
            ::continue::
        end
    else
        count = count + 1
    end
end
if #arg ~= 1 then
    print("Usage: nqueens.lua <board_size>")
    return
end
local n = tonumber(arg[1])
if not n or n <= 0 then
    print("Invalid input! Board size must be a positive integer!")
    return
end
count = 0
local lock_col = {}
local lock_ltrb = {}
local lock_rtlb = {}
for i = 0, n-1 do
    lock_col[i] = false
    lock_ltrb[i] = false
    lock_rtlb[i] = false
end
print("Solving: n=" .. n)
solve(0, n, lock_col, lock_ltrb, lock_rtlb)
print("Result:  " .. count)
Nim
import os, strutils
var
  count = 0
proc solve(n: int, row: int, lockCol: var seq[bool], lockLtrb: var seq[bool], lockRtlb: var seq[bool]) =
  if row < n:
    for dx in 0..<n:
      if lockCol[dx] or lockLtrb[dx - row + n - 1] or lockRtlb[dx + row]:
        continue
      lockCol[dx] = true
      lockLtrb[dx - row + n - 1] = true
      lockRtlb[dx + row] = true
      solve(n, row + 1, lockCol, lockLtrb, lockRtlb)
      lockCol[dx] = false
      lockLtrb[dx - row + n - 1] = false
      lockRtlb[dx + row] = false
  else:
    inc(count)
proc main() =
  let args = commandLineParams()
  if args.len != 1:
    echo "Usage: nqueens <board_size>"
    return
  let n = parseInt(args[0])
  if n <= 0:
    echo "Invalid input! Board size must be a positive integer!"
    return
  
  var
    lockCol = newSeq[bool](n)
    lockLtrb = newSeq[bool](n*2-1)
    lockRtlb = newSeq[bool](n*2-1)
  for i in 0..<lock_col.len:
    lock_col[i] = false
  for i in 0..<lock_ltrb.len:
    lock_ltrb[i] = false
  for i in 0..<lock_rtlb.len:
    lock_rtlb[i] = false
  echo "Solving: n=", n
  solve(n, 0, lockCol, lockLtrb, lockRtlb)
  echo "Result:  ", count
main()
Ocaml
let () =
  if Array.length Sys.argv <> 2 then
    Printf.printf "Usage: ./nqueens <board_size>\n"
  else
    let n =
      try int_of_string Sys.argv.(1)
      with Failure _ ->
        Printf.printf "Invalid input! Board size must be a positive integer!\n";
        exit 1
    in
    if n <= 0 then
      Printf.printf "Invalid input! Board size must be a positive integer!\n"
    else
      let count = ref 0 in
      let rec solve row lock_col lock_ltrb lock_rtlb =
        if row < n then
          for dx = 0 to n - 1 do
            if not lock_col.(dx) && not lock_ltrb.(dx - row + n - 1) && not lock_rtlb.(dx + row) then begin
              lock_col.(dx) <- true;
              lock_ltrb.(dx - row + n - 1) <- true;
              lock_rtlb.(dx + row) <- true;
              
              solve (row + 1) lock_col lock_ltrb lock_rtlb;
              
              lock_col.(dx) <- false;
              lock_ltrb.(dx - row + n - 1) <- false;
              lock_rtlb.(dx + row) <- false;
            end
          done
        else
          incr count
      in
      let lock_col = Array.make n false in
      let lock_ltrb = Array.make (2 * n - 1) false in
      let lock_rtlb = Array.make (2 * n - 1) false in
      Printf.printf "Solving: n=%d\n" n;
      solve 0 lock_col lock_ltrb lock_rtlb;
      Printf.printf "Result:  %d\n" !count
Pascal
program NQueens;
uses SysUtils;
var
  n, code: Integer;
  count: Int64;
procedure Solve(row: Integer; var lock_col, lock_ltrb, lock_rtlb: array of Boolean);
var
  dx: Integer;
begin
  if row < n then
  begin
    for dx := 0 to n - 1 do
    begin
      if not lock_col[dx] and not lock_ltrb[dx - row + n - 1] and not lock_rtlb[dx + row] then
      begin
        lock_col[dx] := True;
        lock_ltrb[dx - row + n - 1] := True;
        lock_rtlb[dx + row] := True;
        Solve(row + 1, lock_col, lock_ltrb, lock_rtlb);
        lock_col[dx] := False;
        lock_ltrb[dx - row + n - 1] := False;
        lock_rtlb[dx + row] := False;
      end;
    end;
  end
  else
    Inc(count);
end;
var
  lock_col, lock_ltrb, lock_rtlb: array of Boolean;
  i: Integer;
begin
  if ParamCount <> 1 then
  begin
    Writeln('Usage: NQueens <board_size>');
    Halt(1);
  end;
  Val(ParamStr(1), n, code);
  if code <> 0 then
  begin
    Writeln('Invalid input! Board size must be a positive integer!');
    Halt(1);
  end;
  if n <= 0 then
  begin
    Writeln('Invalid input! Board size must be a positive integer!');
    Halt(1);
  end;
  Writeln('Solving: n=', n);
  count := 0;
  SetLength(lock_col, n);
  SetLength(lock_ltrb, 2 * n - 1);
  SetLength(lock_rtlb, 2 * n - 1);
  for i := 0 to n - 1 do
    lock_col[i] := False;
  for i := 0 to 2 * n - 2 do
  begin
    lock_ltrb[i] := False;
    lock_rtlb[i] := False;
  end;
  Solve(0, lock_col, lock_ltrb, lock_rtlb);
  Writeln('Result:  ', count);
end.
Perl
use strict;
use warnings;
my $n;
my $result = 0;
if (@ARGV != 1) {
    print "Usage: perl nqueens.pl <board_size>\n";
    exit;
}
if ($ARGV[0] =~ /^\d+$/) {
    $n = $ARGV[0];
} else {
    print "Invalid input! Board size must be a positive integer!\n";
    exit;
}
if ($n <= 0) {
    print "Invalid input! Board size must be a positive integer!\n";
    exit;
}
my @lock_col = (0) x $n;
my @lock_ltrb = (0) x (2 * $n - 1);
my @lock_rtlb = (0) x (2 * $n - 1);
print "Solving: n=$n\n";
$result = solve(0, $n, \@lock_col, \@lock_ltrb, \@lock_rtlb);
print "Result:  $result\n";
sub solve {
    my ($row, $n, $lock_col, $lock_ltrb, $lock_rtlb) = @_;
    return 1 if $row >= $n;
    my $solutions = 0;
    
    for my $dx (0 .. $n - 1) {
        if ($lock_col->[$dx] || $lock_ltrb->[$dx - $row + $n - 1] || $lock_rtlb->[$dx + $row]) {
            next;
        }
        $lock_col->[$dx] = 1;
        $lock_ltrb->[$dx - $row + $n - 1] = 1;
        $lock_rtlb->[$dx + $row] = 1;
        $solutions += solve($row + 1, $n, $lock_col, $lock_ltrb, $lock_rtlb);
        $lock_col->[$dx] = 0;
        $lock_ltrb->[$dx - $row + $n - 1] = 0;
        $lock_rtlb->[$dx + $row] = 0;
    }
    return $solutions;
}
PHP
<?php
if ($argc != 2) {
    echo "Usage: php NQueens.php <board_size>\n";
    exit;
}
if (is_numeric($argv[1]) && $argv[1] > 0) {
    $n = (int)$argv[1];
} else {
    echo "Invalid input! Board size must be a positive integer!\n";
    exit;
}
$lock_col = array_fill(0, $n, false);
$lock_ltrb = array_fill(0, 2 * $n - 1, false);
$lock_rtlb = array_fill(0, 2 * $n - 1, false);
echo "Solving: n=$n\n";
$result = solve(0, $n, $lock_col, $lock_ltrb, $lock_rtlb);
echo "Result:  $result\n";
function solve($row, $n, &$lock_col, &$lock_ltrb, &$lock_rtlb) {
    if ($row >= $n) {
        return 1;
    }
    $solutions = 0;
    for ($dx = 0; $dx < $n; $dx++) {
        if ($lock_col[$dx] || $lock_ltrb[$dx - $row + $n - 1] || $lock_rtlb[$dx + $row]) {
            continue;
        }
        $lock_col[$dx] = true;
        $lock_ltrb[$dx - $row + $n - 1] = true;
        $lock_rtlb[$dx + $row] = true;
        $solutions += solve($row + 1, $n, $lock_col, $lock_ltrb, $lock_rtlb);
        $lock_col[$dx] = false;
        $lock_ltrb[$dx - $row + $n - 1] = false;
        $lock_rtlb[$dx + $row] = false;
    }
    return $solutions;
}
?>
Python
import sys
def main():
    if len( sys.argv ) != 2:
        print("Usage: python NQueens.py <board_size>")
        return
    try:
        n = int( sys.argv[1] )
    except ValueError:
        print("Invalid input! Board size must be a positive integer!")
        return
    if n <= 0:
        print("Invalid input! Board size must be a positive integer!")
        return
    lock_col = [False] * n
    lock_ltrb = [False] * (2 * n - 1)
    lock_rtlb = [False] * (2 * n - 1)
    print( f"Solving: n={n}" )
    result = solve( 0, n, lock_col, lock_ltrb, lock_rtlb )
    print( f"Result:  {result}" )
def solve( row, n, lock_col, lock_ltrb, lock_rtlb ):
    if row >= n:
        return 1
    else:
        count = 0
        
        for dx in range( n ):
            if lock_col[dx] or lock_ltrb[dx - row + n - 1] or lock_rtlb[dx + row]:
                continue
            lock_col[dx] = True
            lock_ltrb[dx - row + n - 1] = True
            lock_rtlb[dx + row] = True
            count += solve( row + 1, n, lock_col, lock_ltrb, lock_rtlb )
            lock_col[dx] = False
            lock_ltrb[dx - row + n - 1] = False
            lock_rtlb[dx + row] = False
        return count
if __name__ == "__main__":
    main()
Racket
#lang racket
(define (main args)
  (if (= (length args) 1)
      (let ([n (string->number (car args))])
        (if (and (integer? n) (> n 0))
            (begin
              (printf "Solving: n=~a\n" n)
              (let ([solutions (solve 0 n (make-vector n #f)
                                      (make-vector (+ (* 2 n) -1) #f)
                                      (make-vector (+ (* 2 n) -1) #f))])
                (printf "Result:  ~a\n" solutions)))
            (printf "Invalid input. Please provide a positive integer.\n")))
      (printf "Usage: racket nqueens.rkt <board_size>\n")))
(define (solve row n lock-col lock-ltrb lock-rtlb)
  (if (< row n)
      (let loop ([dx 0] [solutions 0])
        (if (< dx n)
            (if (or (vector-ref lock-col dx)
                    (vector-ref lock-ltrb (+ (- dx row) (- n 1)))
                    (vector-ref lock-rtlb (+ dx row)))
                (loop (+ dx 1) solutions)
                (begin
                  (vector-set! lock-col dx #t)
                  (vector-set! lock-ltrb (+ (- dx row) (- n 1)) #t)
                  (vector-set! lock-rtlb (+ dx row) #t)
                  (let ([new-solutions (+ solutions
                                         (solve (+ row 1) n lock-col lock-ltrb lock-rtlb))])
                    (vector-set! lock-col dx #f)
                    (vector-set! lock-ltrb (+ (- dx row) (- n 1)) #f)
                    (vector-set! lock-rtlb (+ dx row) #f)
                    (loop (+ dx 1) new-solutions))))
            solutions))
      1))
;; Entry point
(main (vector->list (current-command-line-arguments)))
Ruby
class NQueens
  @n = 10
  @count = 0
  def self.solve(row, lock_col, lock_ltrb, lock_rtlb)
    if row < @n
      (0...@n).each do |dx|
        if lock_col[dx] || lock_ltrb[dx - row + @n - 1] || lock_rtlb[dx + row]
          next
        end
        lock_col[dx] = true
        lock_ltrb[dx - row + @n - 1] = true
        lock_rtlb[dx + row] = true
        solve(row + 1, lock_col, lock_ltrb, lock_rtlb)
        lock_col[dx] = false
        lock_ltrb[dx - row + @n - 1] = false
        lock_rtlb[dx + row] = false
      end
    else
      @count += 1
    end
  end
  def self.main
    if ARGV.length != 1
      puts "Usage: NQueens <board_size>"
      return
    end
    begin
      @n = Integer(ARGV[0])
    rescue ArgumentError
      puts "Invalid input! Board size must be a positive integer!"
      return
    end
    if @n <= 0
      puts "Invalid input! Board size must be a positive integer!"
      return
    end
    lock_col = Array.new(@n, false)
    lock_ltrb = Array.new(2 * @n - 1, false)
    lock_rtlb = Array.new(2 * @n - 1, false)
    puts "Solving: n=#{@n}"
    solve(0, lock_col, lock_ltrb, lock_rtlb)
    puts "Result:  #{@count}"
  end
end
NQueens.main
Rust
use std::env;
fn solve(
    row: usize,
    n: usize,
    lock_col: &mut Vec<bool>,
    lock_ltrb: &mut Vec<bool>,
    lock_rtlb: &mut Vec<bool>,
) -> usize {
    if row == n {
        return 1;
    }
    let mut count = 0;
    for dx in 0..n {
        let ltrb_index = dx + row;
        let rtlb_index = n - 1 + dx - row;
        if lock_col[dx] || lock_ltrb[ltrb_index] || lock_rtlb[rtlb_index] {
            continue;
        }
        lock_col[dx] = true;
        lock_ltrb[ltrb_index] = true;
        lock_rtlb[rtlb_index] = true;
        count += solve(row + 1, n, lock_col, lock_ltrb, lock_rtlb);
        lock_col[dx] = false;
        lock_ltrb[ltrb_index] = false;
        lock_rtlb[rtlb_index] = false;
    }
    count
}
fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() != 2 {
        eprintln!("Usage: {} <board size>", args[0]);
        std::process::exit(1);
    }
    let n: usize = match args[1].parse() {
        Ok(num) if num > 0 => num,
        _ => {
            eprintln!("Error: Board size must be a positive integer.");
            std::process::exit(1);
        }
    };
    let mut lock_col = vec![false; n];
    let mut lock_ltrb = vec![false; 2 * n - 1];
    let mut lock_rtlb = vec![false; 2 * n - 1];
    println!("Solving: n={}", n);
    let result = solve(0, n, &mut lock_col, &mut lock_ltrb, &mut lock_rtlb);
    println!("Result:  {}", result);
}
Scala
object NQueens {
  var n = 10
  var count = 0
  def solve(): Int = {
    val lockCol = Array.fill(n)(false)
    val lockLtrb = Array.fill(2 * n - 1)(false)
    val lockRtlb = Array.fill(2 * n - 1)(false)
    solveRow(0, lockCol, lockLtrb, lockRtlb)
  }
  def solveRow(row: Int, lockCol: Array[Boolean], lockLtrb: Array[Boolean], lockRtlb: Array[Boolean]): Int = {
    if (row >= n) {
      1
    } else {
      var solutions = 0
      for (dx <- 0 until n) {
        if (lockCol(dx) || lockLtrb(dx - row + n - 1) || lockRtlb(dx + row)) {
          // Skip if the current position is not safe
          // Continue to next column
        } else {
          lockCol(dx) = true
          lockLtrb(dx - row + n - 1) = true
          lockRtlb(dx + row) = true
          solutions += solveRow(row + 1, lockCol, lockLtrb, lockRtlb)
          // Backtrack
          lockCol(dx) = false
          lockLtrb(dx - row + n - 1) = false
          lockRtlb(dx + row) = false
        }
      }
      solutions
    }
  }
  def main(args: Array[String]): Unit = {
    if (args.length != 1) {
      println("Usage: NQueens <board_size>")
      return
    }
    try {
      n = args(0).toInt
    } catch {
      case _: NumberFormatException =>
        println("Invalid input! Board size must be a positive integer!")
        return
    }
    if (n <= 0) {
      println("Invalid input! Board size must be a positive integer!")
      return
    }
    println(s"Solving: n=$n")
    count = solve()
    println(s"Result:  $count")
  }
}
TCL
#!/usr/bin/env tclsh
proc solve {row n} {
    global lock_col lock_ltrb lock_rtlb count
    if {$row == $n} {
        incr count
        return
    }
    for {set dx 0} {$dx < $n} {incr dx} {
        set ltrb_index [expr {$dx - $row + $n - 1}]
        set rtlb_index [expr {$dx + $row}]
        if {[info exists lock_col($dx)] && $lock_col($dx) == 1} continue
        if {[info exists lock_ltrb($ltrb_index)] && $lock_ltrb($ltrb_index) == 1} continue
        if {[info exists lock_rtlb($rtlb_index)] && $lock_rtlb($rtlb_index) == 1} continue
        set lock_col($dx) 1
        set lock_ltrb($ltrb_index) 1
        set lock_rtlb($rtlb_index) 1
        solve [expr {$row + 1}] $n
        unset lock_col($dx)
        unset lock_ltrb($ltrb_index)
        unset lock_rtlb($rtlb_index)
    }
}
if {[llength $argv] < 1} {
    puts "Usage: $argv0 <board size>"
    exit 1
}
set n [lindex $argv 0]
array set lock_col {}
array set lock_ltrb {}
array set lock_rtlb {}
set count 0
puts "Solving: n=$n"
solve 0 $n
puts "Result:  $count"
TypeScript
let n = 10;
let count = 0;
function solve(row: number, lockCol: boolean[], lockLtrb: boolean[], lockRtlb: boolean[]): number {
    if (row >= n) {
        return 1;
    } else {
        let solutions = 0;
        for (let dx = 0; dx < n; dx++) {
            if (lockCol[dx] || lockLtrb[dx - row + n - 1] || lockRtlb[dx + row]) {
                continue;
            }
            lockCol[dx] = true;
            lockLtrb[dx - row + n - 1] = true;
            lockRtlb[dx + row] = true;
            solutions += solve(row + 1, lockCol, lockLtrb, lockRtlb);
            lockCol[dx] = false;
            lockLtrb[dx - row + n - 1] = false;
            lockRtlb[dx + row] = false;
        }
        return solutions;
    }
}
function main() {
    const args = process.argv.slice(2);
    if (args.length !== 1) {
        console.log("Usage: NQueens <board_size>");
        return;
    }
    const input = parseInt(args[0]);
    if (isNaN(input)) {
        console.log("Invalid input! Board size must be a positive integer!");
        return;
    }
    n = input;
    if (n <= 0) {
        console.log("Invalid input! Board size must be a positive integer!");
        return;
    }
    let lockCol: boolean[] = new Array(n).fill(false);
    let lockLtrb: boolean[] = new Array(2 * n - 1).fill(false);
    let lockRtlb: boolean[] = new Array(2 * n - 1).fill(false);
    console.log(`Solving: n=${n}`);
    count = solve(0, lockCol, lockLtrb, lockRtlb);
    console.log(`Result:  ${count}`);
}
main();
Vala
public class NQueens {
	
	private static int n = 10;
	private static int count = 0;
	public static void main( string[] args ) {
		if( args.length != 2 ) {
			stdout.printf( "Usage: NQueens <board_size>\n" );
			return;
		}
		try {
			n = int.parse( args[ 1 ] );
		} catch( Error e ) {
			stdout.printf( "Invalid input! Board size must be a positive integer!" );
			return;
		}
		if( n <= 0 ) {
			stdout.printf( "Invalid input! Board size must be a positive integer!" );
			return;
    }
		stdout.printf( "Solving: n=%i\n", n );
		solve( 0, new bool[ n ], new bool[ n * 2 - 1 ], new bool[ n * 2 - 1 ] );
		stdout.printf( "Result:  %i\n", count );
	}
	
	private static void solve( int row, bool[] lock_col, bool[] lock_ltrb, bool[] lock_rtlb ) {
		if( row < n )
			for( int dx = 0; dx < n; dx++ ) {
				if( lock_col[ dx ] || lock_ltrb[ dx - row + n - 1 ] || lock_rtlb[ dx + row ] )
					continue;
				lock_col[ dx ] = true;
				lock_ltrb[ dx - row + n - 1 ] = true;
				lock_rtlb[ dx + row ] = true;
				solve( row + 1, lock_col, lock_ltrb, lock_rtlb );
				lock_col[ dx ] = false;
				lock_ltrb[ dx - row + n - 1 ] = false;
				lock_rtlb[ dx + row ] = false;
			}
		else
			count++;
	}
}
YABasic
open "n.txt" for reading as #1
line input #1 n
close #1
dim lock_col(n), lock_ltrb(n * 2 - 1), lock_rtlb(n * 2 - 1)
for i = 0 to n - 1
    lock_col(i) = 0
next
for i = 0 to 2 * n - 2
    lock_ltrb(i) = 0
    lock_rtlb(i) = 0
next
result = 0
print "Solving: n="; 
print n;
print "\n";
solve(0)
print "Result:  ";
print result
end
sub solve(row)
    if row >= n then
        result = result + 1
        return
    end if
    local col
    for col = 0 to n - 1
        if lock_col(col) = 1 or lock_ltrb(col - row + n - 1) = 1 or lock_rtlb(col + row) = 1 then
            rem continue
            rem next
        else
            lock_col(col) = 1
            lock_ltrb(col - row + n - 1) = 1
            lock_rtlb(col + row) = 1
            solve(row + 1)
            lock_col(col) = 0
            lock_ltrb(col - row + n - 1) = 0
            lock_rtlb(col + row) = 0
        end if
        next
    return
end sub