N Queens
by rocketegg0
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]);
...