Aslai

Eight Queens

Jan 15th, 2012
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include<process.h>
  5. #include "hr_time.h"
  6.  
  7. #define BHAND(op)\
  8. {\
  9. int s;\
  10. for( s = 0; s < n; ++s ){\
  11.     op (board[i + s * n ]);\
  12. }\
  13. for( s = 0; s < n; ++s ){\
  14.     op (board[ s + j * n ]);\
  15. }\
  16. for( s = 1; (i - s >= 0) && (j - s >= 0); ++s ){\
  17.     op (board[ ( i - s ) + ( j - s ) * n ]);\
  18. }\
  19. for( s = 1; (i + s < n) && (j - s >= 0); ++s ){\
  20.     op (board[ ( i + s ) + ( j - s ) * n ]);\
  21. }\
  22. for( s = 1; (i - s >= 0) && (j + s < n); ++s ){\
  23.     op (board[ ( i - s ) + ( j + s ) * n ]);\
  24. }\
  25. for( s = 1; (i + s < n) && (j + s < n); ++s ){\
  26.     op (board[ ( i + s ) + ( j + s ) * n ]);\
  27. }\
  28. }
  29. HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL);
  30. int w = 0;
  31. int solutions = 0;
  32. int wp = 0;
  33. int pending = 0;
  34.  
  35. _stdcall unsigned getsols( void* s ){
  36.  
  37.     int ypos = ((int*)s)[1];
  38.     int n = ((int*)s)[0];
  39.     int boardsize = n * n * sizeof( int );
  40.     int* board = (int*) malloc( boardsize );
  41.     memset( board, 0, boardsize );
  42.     int* boardb = (int*) malloc( boardsize );
  43.     int* stack = (int*) malloc( ( n + 1 ) * sizeof( int ) );
  44.     *stack = -1;
  45.     stack++;
  46.     *stack = 0;
  47.     int t = 1;
  48.     int i = 0;
  49.     int sols = 0;
  50.  
  51.     int j = ypos;
  52.     BHAND(++);
  53.  
  54.     while( *stack != -1 ){
  55.         for( i = 1; i < n; ++i )
  56.         {
  57.             j = 0;
  58.             if( t == 0 ){
  59.                 --stack;
  60.                 if(*stack == -1)
  61.                     break;
  62.                 i = (*stack & 0xFFFF);
  63.                 j = ((*stack >> 16) & 0xFFFF);
  64.                 //printf("Pop Stack: %i, %i \n", i, j );
  65.                 BHAND(--);
  66.                 ++j;
  67.             }
  68.             t = 0;
  69.             for( ; j < n; ++j )
  70.             {
  71.                 if( board[ i + j * n ] == 0 ){
  72.                     BHAND(++);
  73.                     *stack = (i & 0xFFFF) | ( (j & 0xFFFF) << 16 );
  74.                     //printf("Push Stack: %i, %i = %i, %i\n", i, j, *stack, (i & 0xFFFF) + ( (j & 0xFFFF) << 16 ) );
  75.                     ++stack;
  76.                     *stack = 0;
  77.                     t = 1;
  78.                     break;
  79.                 }
  80.             }
  81.         }
  82.         if( i == n  ){
  83.             int* stackt = stack;
  84.             --stack;
  85.  
  86.  
  87.             int x,y;
  88.             int queens = 0;
  89.             while( *stack != -1 ){
  90.                 ++queens;
  91.                 x = (*stack & 0xFFFF);
  92.                 y = ((*stack >> 16) & 0xFFFF);
  93.                 --stack;
  94.             }
  95.             if( queens == n-1 ){
  96.                 //!Board Display
  97.                 //putchar('\n');
  98.                 /*for( int j = 0; j < n; ++j ){
  99.                     for( int i = 0; i < n; ++i ){
  100.                         //printf( "+-" );
  101.                     }
  102.                     //printf("+\n");
  103.                     for( int i = 0; i < n; ++i ){
  104.                         //printf( "|%c", boardb[i + j * n] == 0 ? ' ' : 'Q' );
  105.                     }
  106.                     //printf("|\n");
  107.                 }
  108.                 for( int i = 0; i < n; ++i ){
  109.                     //printf( "+-" );
  110.                 }
  111.                 //printf("+\n");*/
  112.                 //while( w == 1 ){w=1;}
  113.                 //w = 1;
  114.                 ++sols;
  115.             }
  116.             stack = stackt;
  117.  
  118.         }
  119.     }
  120.     WaitForSingleObject( hIOMutex, INFINITE );
  121.     solutions += sols;
  122.     ReleaseMutex( hIOMutex);
  123. }
  124.  
  125. int main(){
  126.  
  127.     int n = 8;
  128.     printf("N? ");
  129.     scanf("%i", &n);
  130.     int *passin = (int*)malloc( 3 * sizeof(int) * n );
  131.     HANDLE* threads = (HANDLE*) malloc( sizeof(HANDLE)*n);
  132.  
  133.     CStopWatch s;
  134.     s.startTimer();
  135.     for( int i = 0; i < n; i ++ ){
  136.         passin[i * 2] = n;
  137.         passin[i * 2 + 1] = i;
  138.  
  139.         threads[i] = (HANDLE)_beginthreadex( 0, 1000, getsols, passin+(i*2), 0, 0 );
  140.  
  141.     }
  142.     WaitForMultipleObjects(n, threads, true, INFINITE);
  143.  
  144.     s.stopTimer();
  145.     printf("Total solutions found: %i\nTime taken: %f ", solutions, s.getElapsedTime() );
  146.     getchar();
  147.     getchar();
  148.  
  149. }
Advertisement
Add Comment
Please, Sign In to add comment