From de3f61621942295b251c2ee4c2391537b439c6bd Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 17 Aug 2010 01:22:19 +0200 Subject: [PATCH] initial import --- .buildpath | 5 ++ .gitignore | 5 ++ Makefile | 16 +++++ dame.gif | Bin 0 -> 923 bytes index.php | 60 ++++++++++++++++++ ndame.cpp | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++++ ndame.h | 30 +++++++++ schach.css | 62 ++++++++++++++++++ schach.js | 24 +++++++ 9 files changed, 384 insertions(+) create mode 100644 .buildpath create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 dame.gif create mode 100644 index.php create mode 100644 ndame.cpp create mode 100644 ndame.h create mode 100644 schach.css create mode 100644 schach.js 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 0000000000000000000000000000000000000000..6b95f73f714169be76ed494392f811f2060fed48 GIT binary patch literal 923 zcmZ?wbhEHbRANwMc*g(&3JMAw9Gn^&8Ug|WQc_YK9UV7r+}OBrqoJW;U|=X07wfKF zyDnY2bn@iMg9i^578cH)J;%etLqbA0Gc!X%Lb0;4Nn*XicXXD%)-H*P$*eEH#y z9a}Us)D|vW*wN8Cea5Uga~9_37xMG-v$L~_h{y^Gnrmoiv9YlzE1S%nyJYq1)g2v+ zn_K$|3ML&rdh+t+^Sk#R*t~hi_U$`5x_ZOIqe@CDA|t)+?Hv*mohqw4Crs!{PHrzM zX{xMl`tjo%*wcfBQ2fcl$iNW5paXIcC{7sI|2G6QHMg|3wRd!Ob@%l4^-t*HYh_@t zY2js`$jiiF+$=Jcsab!j?F0!1PKH?lq70@M&P|ILy4m@gIT)B&Io6smNjWt!Pc@$$ zz_YVekAbV1jm7XxfB@qZQI#gysq>o!IOQ2QnpqTEgtoOX2sTfh+QP%iDCF{y6) zsrOTvTlqXHCh~AGGPQ)6Hf&<*+E~*R<#S=f+5qmHX08oFTf7-e92prLS~evxDX}TB zxBfXGcz}tgDS<)5;8Ua$>+1z90u3J-^+lT|eP~+2bf7J)&FSl9Nuj%by<0e*oG@3K zw}?~vCF2VQR)<#Zw^9rTUab@AYVCANk`_>4=vA=!;cTR!&;SewF|FK)kOv7JER1Xd z0S*hCP6!I~aV0P<3bJ(7VE*nKdB- zH!c>Q3mogq-tL;KWAe)4z=5{57QY+@rew#ZEPXsrj#RfCYT)KlD41~Z6pMqqjMG8w zgd0a#1&(QJUJUFNY?;y$$GSnRQ&E*eC`GxEfx#L8@ew5t literal 0 HcmV?d00001 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