commit de3f61621942295b251c2ee4c2391537b439c6bd Author: Steffen Vogel Date: Tue Aug 17 01:22:19 2010 +0200 initial import diff --git a/.buildpath b/.buildpath new file mode 100644 index 0000000..8bcb4b5 --- /dev/null +++ b/.buildpath @@ -0,0 +1,5 @@ + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f16baa8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.settings +.cproject +.project +.classpath + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e948113 --- /dev/null +++ b/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/dame.gif b/dame.gif new file mode 100644 index 0000000..6b95f73 Binary files /dev/null and b/dame.gif differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..4c1278b --- /dev/null +++ b/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. +
+Schachbrettgröße =
+
© Steffen Vogel
+info@steffenvogel.de
+http://www.steffenvogel.de
+Based on Micha\'s Javascript & CSS frontend
+
+ +'; + +?> \ No newline at end of file diff --git a/ndame.cpp b/ndame.cpp new file mode 100644 index 0000000..2da20dc --- /dev/null +++ b/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.h b/ndame.h new file mode 100644 index 0000000..73d62ad --- /dev/null +++ b/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/schach.css b/schach.css new file mode 100644 index 0000000..03eb31b --- /dev/null +++ b/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/schach.js b/schach.js new file mode 100644 index 0000000..c17c190 --- /dev/null +++ b/schach.js @@ -0,0 +1,24 @@ +function schach(sol) { + solution = sol.split('|'); + n = solution.length; + + html = ''; + for (col = 0; col < n; col++) + html += ''; + + html += ''; + + for (row = 0; row < n; row++) { + html += ''; + color = row % 2; + for (col = 0; col < n; col++) { + html += (col % 2) == color ? ''; + } + html += ''; + } + html += '
' + (col + 1) + '
' + (row + 1) + '' : ''; + if (col == solution[row] -1) + html += 'X'; + html += '
'; + document.getElementById('show').innerHTML = html; +} \ No newline at end of file