N Queens

HTML

<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0-beta.3/angular.min.js"></script>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.0-beta.3/angular-sanitize.min.js"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.1.0/css/font-awesome.css">
<div ng-controller="myController">
    <div class="panel panel-default">
        <div class="panel-heading">
            N Queens
        </div>
        <div class="panel-body">
            <input type="number" ng-model="sides"/> <button ng-click="solve()">Solve</button> 
            <table class="table table-bordered" style="margin-top:20px">
                <tr><td>Complete in: {{endTime}}ms</td><td>Num Computations: {{numcomputations}}</td><td>Num Solutions: {{solution_grids.length}}</td>
                </tr>
            </table>
        <div class="panel-body">
            <pre ng-repeat="grid in solution_grids"><h4>Solution {{$index+1}}</h4>{{grid}}</pre>
        </div>
    </div>
</div>

    <!-- tag.html -->
    <script type="text/ng-template" id="tag.html">
        <div class="input-group" ng-show="!read">
            <input type="text" name="temptags" ng-model="temptags" class="form-control"  placeholder="Enter comma separated tags" ng-class="{'haserror':!validate(temptags)}" style="margin-bottom:0px"/>
            <span ng-show="!validate(temptags)" class="label label-danger">Please only use regular characters for tags (a-z)</span>
            <div class="input-group-btn" style="vertical-align:top">
                <button class="btn btn-inline" ng-click="appendTags(temptags)">Add</button>
            </div>
        </div>
        
        <div class="margintopten">
            <span class="label label-default normal tag marginrightten" ng-repeat="tag in tags"><a ng-click="deleteTag(tag)" ng-if="!read"><i class="fa fa-times-circle"...

JavaScript

var mymodule = angular.module('mymodule', ['ngSanitize']);

mymodule.controller("myController", function ($scope) {
    
    $scope.sides = 6;
    
    function Pair(x, y) {
        this.x = x;
        this.y = y;
    }
    
    function Grid(width, height) {
        this.width = width;
        this.height = height;
        var grid = [];
        var validPositions = [];
    
        for (var i = 0; i < width; i++) {
            grid.push([]);
            for (var j = 0; j < height; j++) {
                grid[i][j] = '_';
                validPositions.push(new Pair(i,j))
            }
        }
    
        this.getValidPositions = function() {
            return validPositions;
        }
    
        this.getGrid = function() {
            return grid;
        }
        
        //Position validation
        function isQueen(pair, x, y) {
            return pair.x == x && pair.y == y;
        }
        
        function isInRow(pair, y) {
            return pair.y == y;
        }
        
        function isInCol(pair, x) {
            return pair.x == x;
        }
        
        //Ex: 
        //3, 2 > 4, 1 = -1, 1
        //3, 2 > 4, 3 = -1, -1
        //3, 2 > 2, 1 = 1, 1
        //3, 2 > 2, 3 = 1, -1
        function isInDiagonal(pair, x, y) {
            if (Math.abs(pair.x - x) == Math.abs(pair.y - y)) {
                return true;
            }
            return false;
        }
        
        function testPosition(pair, x, y) {
            if (isQueen(pair, x, y) ||
                isInRow(pair, y) ||
                isInCol(pair, x) ||
                isInDiagonal(pair, x, y)) {
                return true;
            }
            return false;
        }
    
        function recomputeValid(validPositions, queenX, queenY) {
            var newValid = [];
            for (var i = 0; i < validPositions.length; i++) {
                if (!testPosition(validPositions[i], queenX, queenY)) {
                    newValid.push(validPositions[i]);
    ...