diff --git a/ndame/.buildpath b/ndame/.buildpath
new file mode 100644
index 0000000..8bcb4b5
--- /dev/null
+++ b/ndame/.buildpath
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/ndame/.gitignore b/ndame/.gitignore
new file mode 100644
index 0000000..f16baa8
--- /dev/null
+++ b/ndame/.gitignore
@@ -0,0 +1,5 @@
+.settings
+.cproject
+.project
+.classpath
+
diff --git a/ndame/Makefile b/ndame/Makefile
new file mode 100644
index 0000000..e948113
--- /dev/null
+++ b/ndame/Makefile
@@ -0,0 +1,16 @@
+CXX = g++
+CXXFLAGS = -g -Wall
+
+OBJS = ndame.o
+TARGET = dame
+
+$(TARGET): $(OBJS)
+ $(CXX) -o $(TARGET) $(OBJS)
+
+all: $(TARGET)
+
+clean:
+ rm -f $(OBJS) $(TARGET)
+
+%.o: $(SRCDIR)/%.cpp
+ $(CXX) $(CCXFLAGS) -c $<
diff --git a/ndame/dame.gif b/ndame/dame.gif
new file mode 100644
index 0000000..6b95f73
Binary files /dev/null and b/ndame/dame.gif differ
diff --git a/ndame/index.php b/ndame/index.php
new file mode 100644
index 0000000..4c1278b
--- /dev/null
+++ b/ndame/index.php
@@ -0,0 +1,60 @@
+ 13) {
+ die('Sorry but his is too large!');
+}
+
+echo '
+
+
+
+
+n-Damen Problem - Backtracking
+
+
+
+
+
+
+';
+
+$start = microtime(true);
+$solutions = shell_exec('./dame ' . $n);
+$end = microtime(true);
+$diff = round(($end - $start) * 1000);
+$count = count(explode("\n", $solutions));
+
+echo 'Für das n-Damen-Problem mit Schachbrettgröße ' . $n . ' wurden ' . $count . ' Lösungen gefunden.
+
+
Bitte eine Lösung wählen, um diese anzuzeigen.
+
+
Dazu wurde folgende Zeit benötigt: ' . $diff . ' ms.
+
+
+
+
+';
+
+?>
\ No newline at end of file
diff --git a/ndame/ndame.cpp b/ndame/ndame.cpp
new file mode 100644
index 0000000..2da20dc
--- /dev/null
+++ b/ndame/ndame.cpp
@@ -0,0 +1,182 @@
+#include
+#include
+
+//#define DEBUG
+
+#include "ndame.h"
+
+NDame::NDame(int n) {
+ this->n = n;
+ this->row = 0;
+ this->col = 0;
+
+ for (int i = 0; i < n; i++) {
+ set.push_back(-1); // noch keine Dame wurde in diese Zeile gesetzt
+ for (int j = 0; j < n; j++) {
+ std::vector temp(n, 0);
+ locked.push_back(temp);
+ }
+ }
+}
+
+void NDame::Run() {
+ while (row < n) {
+ while (col < n) {
+ if (Check(row, col) && col > set[row]) {
+ Set(row, col);
+
+#ifdef DEBUG
+ Show(&set);
+#endif /* DEBUG */
+
+ break;
+ } else {
+ col++;
+
+#ifdef DEBUG
+ std::cout << "col++" << std::endl;
+#endif /* DEBUG */
+
+ }
+ }
+
+ if (col == n) {
+ if (set[row - 1] >= n -1 && row == 0)
+ break;
+ else
+ Backtrack();
+ } else {
+ row++;
+ col = 0;
+
+ if (row == n) {
+#ifdef DEBUG
+ std::cout << "New Solution: Nr. " << sol_count << std::endl;
+#endif /* DEBUG */
+
+ solutions.push_back(set);
+ Backtrack();
+ }
+
+#ifdef DEBUG
+ std::cout << "row++; col = 0;" << std::endl;
+#endif /* DEBUG */
+
+ }
+ }
+}
+
+bool NDame::Check(int row, int col) {
+ bool check;
+ check = (locked[row][col] > 0) ? false : true;
+
+#ifdef DEBUG
+ std::cout << "Check: " << row << "|" << col << " " << check << std::endl;
+#endif /* DEBUG */
+
+ return check;
+}
+
+void NDame::Set(int row, int col) {
+ for (int i = 0; i < n; i++)
+ locked[row][i]++; // Vertikal
+
+ for (int j = 0; j < n; j++)
+ locked[j][col]++; // Horizontal
+
+ for (int k = 0; k < n; k++)
+ if ((col - row + k) < n && (col - row + k) >= 0)
+ locked[k][col - row + k]++; // Diagonal oben links -> unten rechts
+
+ for (int l = 0; l < n; l++)
+ if ((row + col - l) < n && (row + col - l) >= 0)
+ locked[l][row + col - l]++; // Diagonal unten links -> oben rechts
+
+ set[row] = col;
+
+#ifdef DEBUG
+ std::cout << "Neue Dame: " << row << "|" << col << std::endl;
+#endif /* DEBUG */
+
+}
+
+void NDame::UnSet(int row, int col) {
+ for (int i = 0; i < n; i++)
+ locked[row][i]--; // Vertikal
+
+ for (int j = 0; j < n; j++)
+ locked[j][col]--; // Horizontal
+
+ for (int k = 0; k < n; k++)
+ if ((col - row + k) < n && (col - row + k) >= 0)
+ locked[k][col - row + k]--; // Diagonal oben links -> unten rechts
+
+ for (int l = 0; l < n; l++)
+ if ((row + col - l) < n && (row + col - l) >= 0)
+ locked[l][row + col - l]--; // Diagonal unten links -> oben rechts
+
+ set[row] = -1;
+
+#ifdef DEBUG
+ std::cout << "Dame entfernt: " << row << "|" << col << std::endl;
+#endif /* DEBUG */
+
+}
+
+void NDame::Show(const std::vector *p) {
+ std::cout << " ||";
+ for (int l = 0; l < n; l++)
+ std::cout << l << "|";
+ std::cout << std::endl;
+
+ for (int i = 0; i < n; i++) {
+ std::cout << ((i < 10) ? " " : "") << i << "||";
+ for (int j = 0; j < n; j++)
+ std::cout << ((p->at(i) == j) ? 'X' : ' ') << "|";
+
+ std::cout << " " << p->at(i) << std::endl;
+ }
+}
+
+int main(int argc, char* argv[]) {
+ if (argc >= 2) {
+ //std::cout << "Berechne das n-Damenproblem für " << argv[1] << " Damen" << std::endl;
+ NDame dame(atoi(argv[1]));
+ dame.Run();
+
+ dame.ShowSolutions();
+
+ //std::cout << dame.solutions.size() << " Lösungen" << std::endl;
+
+ if (argc == 3)
+ dame.Show(&dame.solutions.at(atoi(argv[2]) - 1));
+ } else {
+ std::cout << "Bitte geben Sie einen Paramenter an!" << std::endl;
+ }
+}
+
+void NDame::ShowSolutions() {
+ for (std::vector >::iterator i = solutions.begin(); i
+ != solutions.end(); i++) {
+ for (std::vector::iterator p = i->begin(); p != i->end(); p++)
+ std::cout << *p + 1 << ((*p != i->back()) ? "|" : "");
+ if (*i != solutions.back())
+ std::cout << std::endl;
+ }
+}
+
+void NDame::Backtrack() {
+
+#ifdef DEBUG
+ std::cout << "Backtrack: we will reject dame " << row - 1 << "|" << set[row - 1] << std::endl;
+#endif /* DEBUG */
+
+ col = set[row - 1] + 1;
+ UnSet(row - 1, set[row - 1]);
+
+#ifdef DEBUG
+ Show(&set);
+#endif /* DEBUG */
+
+ row--;
+}
diff --git a/ndame/ndame.h b/ndame/ndame.h
new file mode 100644
index 0000000..73d62ad
--- /dev/null
+++ b/ndame/ndame.h
@@ -0,0 +1,30 @@
+#ifndef NDAME_H_
+#define NDAME_H_
+
+#include
+
+class NDame {
+public:
+ NDame(int n);
+
+ int n;
+ int row;
+ int col;
+
+ std::vector > solutions;
+ std::vector > locked;
+ std::vector set;
+
+ void Run();
+ void Show(const std::vector *p);
+ void ShowSolutions();
+ void Set(int row, int col);
+ void UnSet(int row, int col);
+ void Backtrack();
+ bool Check(int row, int col);
+
+private:
+
+};
+
+#endif /*NDAME_H_*/
diff --git a/ndame/schach.css b/ndame/schach.css
new file mode 100644
index 0000000..03eb31b
--- /dev/null
+++ b/ndame/schach.css
@@ -0,0 +1,62 @@
+body {
+ padding: 10px 0 0 30px;
+}
+
+#wrapper {
+ width: 1050px;
+ margin: 0 auto;
+}
+
+#header {
+ font-size: 300%;
+ text-decoration: underline;
+ text-align: center;
+ margin-bottom: 10px;
+}
+
+#sols {
+ float: left;
+ height: 300px
+}
+
+#copy {
+ font-size: 90%;
+ float: right;
+ S
+}
+
+#show {
+ float: right;
+ width: 700px;
+}
+
+.show {
+ background-color: #000;
+}
+
+.show td {
+ text-align: center;
+}
+
+.show th {
+ height: 30px;
+ background-color: #fff;
+ width: 50px;
+}
+
+.headleft {
+ background-color: #fff;
+ width: 30px;
+}
+
+.white {
+ background-color: #fff;
+ width: 50px;
+ height: 50px;
+}
+
+.black {
+ background-color: #999;
+ width: 50px;
+ height: 50px;
+}
\ No newline at end of file
diff --git a/ndame/schach.js b/ndame/schach.js
new file mode 100644
index 0000000..c17c190
--- /dev/null
+++ b/ndame/schach.js
@@ -0,0 +1,24 @@
+function schach(sol) {
+ solution = sol.split('|');
+ n = solution.length;
+
+ html = ' | ';
+ for (col = 0; col < n; col++)
+ html += '' + (col + 1) + ' | ';
+
+ html += '
';
+
+ for (row = 0; row < n; row++) {
+ html += '' + (row + 1) + ' | ';
+ color = row % 2;
+ for (col = 0; col < n; col++) {
+ html += (col % 2) == color ? '' : ' | ';
+ if (col == solution[row] -1)
+ html += ' ';
+ html += ' | ';
+ }
+ html += '
';
+ }
+ html += '
';
+ document.getElementById('show').innerHTML = html;
+}
\ No newline at end of file