Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include<string.h>
- #include<process.h>
- #include "hr_time.h"
- #define BHAND(op)\
- {\
- int s;\
- for( s = 0; s < n; ++s ){\
- op (board[i + s * n ]);\
- }\
- for( s = 0; s < n; ++s ){\
- op (board[ s + j * n ]);\
- }\
- for( s = 1; (i - s >= 0) && (j - s >= 0); ++s ){\
- op (board[ ( i - s ) + ( j - s ) * n ]);\
- }\
- for( s = 1; (i + s < n) && (j - s >= 0); ++s ){\
- op (board[ ( i + s ) + ( j - s ) * n ]);\
- }\
- for( s = 1; (i - s >= 0) && (j + s < n); ++s ){\
- op (board[ ( i - s ) + ( j + s ) * n ]);\
- }\
- for( s = 1; (i + s < n) && (j + s < n); ++s ){\
- op (board[ ( i + s ) + ( j + s ) * n ]);\
- }\
- }
- HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL);
- int w = 0;
- int solutions = 0;
- int wp = 0;
- int pending = 0;
- _stdcall unsigned getsols( void* s ){
- int ypos = ((int*)s)[1];
- int n = ((int*)s)[0];
- int boardsize = n * n * sizeof( int );
- int* board = (int*) malloc( boardsize );
- memset( board, 0, boardsize );
- int* boardb = (int*) malloc( boardsize );
- int* stack = (int*) malloc( ( n + 1 ) * sizeof( int ) );
- *stack = -1;
- stack++;
- *stack = 0;
- int t = 1;
- int i = 0;
- int sols = 0;
- int j = ypos;
- BHAND(++);
- while( *stack != -1 ){
- for( i = 1; i < n; ++i )
- {
- j = 0;
- if( t == 0 ){
- --stack;
- if(*stack == -1)
- break;
- i = (*stack & 0xFFFF);
- j = ((*stack >> 16) & 0xFFFF);
- //printf("Pop Stack: %i, %i \n", i, j );
- BHAND(--);
- ++j;
- }
- t = 0;
- for( ; j < n; ++j )
- {
- if( board[ i + j * n ] == 0 ){
- BHAND(++);
- *stack = (i & 0xFFFF) | ( (j & 0xFFFF) << 16 );
- //printf("Push Stack: %i, %i = %i, %i\n", i, j, *stack, (i & 0xFFFF) + ( (j & 0xFFFF) << 16 ) );
- ++stack;
- *stack = 0;
- t = 1;
- break;
- }
- }
- }
- if( i == n ){
- int* stackt = stack;
- --stack;
- int x,y;
- int queens = 0;
- while( *stack != -1 ){
- ++queens;
- x = (*stack & 0xFFFF);
- y = ((*stack >> 16) & 0xFFFF);
- --stack;
- }
- if( queens == n-1 ){
- //!Board Display
- //putchar('\n');
- /*for( int j = 0; j < n; ++j ){
- for( int i = 0; i < n; ++i ){
- //printf( "+-" );
- }
- //printf("+\n");
- for( int i = 0; i < n; ++i ){
- //printf( "|%c", boardb[i + j * n] == 0 ? ' ' : 'Q' );
- }
- //printf("|\n");
- }
- for( int i = 0; i < n; ++i ){
- //printf( "+-" );
- }
- //printf("+\n");*/
- //while( w == 1 ){w=1;}
- //w = 1;
- ++sols;
- }
- stack = stackt;
- }
- }
- WaitForSingleObject( hIOMutex, INFINITE );
- solutions += sols;
- ReleaseMutex( hIOMutex);
- }
- int main(){
- int n = 8;
- printf("N? ");
- scanf("%i", &n);
- int *passin = (int*)malloc( 3 * sizeof(int) * n );
- HANDLE* threads = (HANDLE*) malloc( sizeof(HANDLE)*n);
- CStopWatch s;
- s.startTimer();
- for( int i = 0; i < n; i ++ ){
- passin[i * 2] = n;
- passin[i * 2 + 1] = i;
- threads[i] = (HANDLE)_beginthreadex( 0, 1000, getsols, passin+(i*2), 0, 0 );
- }
- WaitForMultipleObjects(n, threads, true, INFINITE);
- s.stopTimer();
- printf("Total solutions found: %i\nTime taken: %f ", solutions, s.getElapsedTime() );
- getchar();
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment