Revision as of 14:41, 31 December 2006 editHex (talk | contribs)Autopatrolled, Administrators25,371 edits {{cleanup-date|December 2006}}← Previous edit |
Latest revision as of 14:39, 5 March 2022 edit undoSahaib (talk | contribs)Extended confirmed users, New page reviewers151,157 editsNo edit summary |
(15 intermediate revisions by 7 users not shown) |
Line 1: |
Line 1: |
|
|
#REDIRECT ] |
|
{{cleanup-date|December 2006}} |
|
|
|
|
|
|
|
{{Redirect category shell|1= |
|
'''The five pillars puzzle''' is a ] in which one is to try to remove a string from a structure of five threaded pillars. |
|
|
|
{{R from alternative name}} |
|
The following image illustrates this structure: |
|
|
|
{{R with history}} |
|
|
|
|
|
}} |
|
<center>]</center> |
|
|
|
|
|
<!-- == Origin ==--> |
|
|
|
|
|
<!--==Description ==--> |
|
|
|
|
|
== A software solution == |
|
|
|
|
|
Apparently, there a general solution for this problem using a mutual recursion (Please note the number of each pillar in the image). The implementation is in C++ but it can be easly converted to any programming language. |
|
|
|
|
|
<pre> |
|
|
#include <iostream> |
|
|
using namespace std; |
|
|
|
|
|
// By Ori Mosenzon |
|
|
|
|
|
void printRange(int n) { |
|
|
if (n==1) |
|
|
cout << 1 << "\n"; |
|
|
else |
|
|
cout << n << ".." << 1 <<"\n"; |
|
|
} |
|
|
|
|
|
void insert(int n); |
|
|
|
|
|
void release_(int c) { |
|
|
if(c==1) |
|
|
return; |
|
|
cout << "Thread through (upwards) ring number " << c << " (stick to the right)\n"; |
|
|
insert(c-1); |
|
|
release_(c-1); |
|
|
} |
|
|
|
|
|
void release(int n) { |
|
|
release_(n); |
|
|
cout << "Remove from "; |
|
|
printRange(n); |
|
|
} |
|
|
|
|
|
void insert_(int c, int n) { |
|
|
if(c==n) |
|
|
return; |
|
|
cout << "Thread through (upwards) ring number " << c+1 << " (stick to the left)\n"; |
|
|
release(c); |
|
|
insert_(c+1,n); |
|
|
} |
|
|
|
|
|
void insert(int n) { |
|
|
cout << "Put over "; |
|
|
printRange(n); |
|
|
insert_(1,n); |
|
|
} |
|
|
|
|
|
int main() { |
|
|
int n; |
|
|
while(true) { |
|
|
cout << "\nnumber of pillars? (0 = quit) "; |
|
|
cin >> n ; |
|
|
if(n<1) |
|
|
break; |
|
|
cout << "insert "<<n<<":\n-------\n"; |
|
|
insert(n); |
|
|
cout << "\n\nrelease "<<n<<":\n-------\n"; |
|
|
release(n); |
|
|
} |
|
|
} |
|
|
</pre> |
|
|
|
|
|
== Execution example == |
|
|
<pre> |
|
|
number of pillars? (0 = quit) 3 |
|
|
3 |
|
|
insert 3: |
|
|
------- |
|
|
Put over 3..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 3 (stick to the left) |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 2..1 |
|
|
|
|
|
|
|
|
release 3: |
|
|
------- |
|
|
Thread through (upwards) ring number 3 (stick to the right) |
|
|
Put over 2..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 3..1 |
|
|
|
|
|
number of pillars? (0 = quit) 5 |
|
|
5 |
|
|
insert 5: |
|
|
------- |
|
|
Put over 5..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 3 (stick to the left) |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 2..1 |
|
|
Thread through (upwards) ring number 4 (stick to the left) |
|
|
Thread through (upwards) ring number 3 (stick to the right) |
|
|
Put over 2..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 3..1 |
|
|
Thread through (upwards) ring number 5 (stick to the left) |
|
|
Thread through (upwards) ring number 4 (stick to the right) |
|
|
Put over 3..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 3 (stick to the left) |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 2..1 |
|
|
Thread through (upwards) ring number 3 (stick to the right) |
|
|
Put over 2..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 4..1 |
|
|
|
|
|
|
|
|
release 5: |
|
|
------- |
|
|
Thread through (upwards) ring number 5 (stick to the right) |
|
|
Put over 4..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 3 (stick to the left) |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 2..1 |
|
|
Thread through (upwards) ring number 4 (stick to the left) |
|
|
Thread through (upwards) ring number 3 (stick to the right) |
|
|
Put over 2..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 3..1 |
|
|
Thread through (upwards) ring number 4 (stick to the right) |
|
|
Put over 3..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 3 (stick to the left) |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 2..1 |
|
|
Thread through (upwards) ring number 3 (stick to the right) |
|
|
Put over 2..1 |
|
|
Thread through (upwards) ring number 2 (stick to the left) |
|
|
Remove from 1 |
|
|
Thread through (upwards) ring number 2 (stick to the right) |
|
|
Put over 1 |
|
|
Remove from 5..1 |
|
|
|
|
|
number of pillars? (0 = quit) 0 |
|
|
|
|
|
</pre> |
|
|
|
|
|
== Notes == |
|
|
* Actually, the code can solve any intermediate stage by invoking the proper relaese_(...)/insert_(...) function. |
|
|
|
|
|
] |
|