fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<pthread.h>
  4. int position[300]={0},col[100]={0},dig[300]={0},invdig[300]={0},count=0,check[100]={0},thread_count;
  5. pthread_t tid[100];
  6. pthread_mutex_t lock;
  7. struct Posi{
  8. int x;
  9. int y;
  10. int n;
  11. int p_col[100];
  12. int p_dig[300];
  13. int p_invdig[300];
  14. int p_position[300];
  15. int thread_id;
  16. };
  17. void nqueen(int n,int row,int n_position[],int n_col[],int n_dig[],int n_invdig[],int which,int x,int y){
  18. int i,j;
  19. if(x!=-1 && y!=-1){
  20. n_col[y]=1;
  21. n_dig[x-y+n]=1;
  22. n_invdig[x+y]=1;
  23. n_position[x]=y;
  24. }
  25. if(row==(n+1)){
  26. /* for(i=1;i<=n;i++){
  27. for(j=1;j<=n;j++){
  28. if(n_position[i]==j)
  29. printf("o");
  30. else
  31. printf("x");
  32. }
  33. printf("\n");
  34. }
  35. printf("=========================\n");*/
  36. pthread_mutex_lock(&lock);
  37. count++;
  38. pthread_mutex_unlock(&lock);
  39. return;
  40. }
  41. else if(check[row]==1){
  42. nqueen(n,row+1,n_position,n_col,n_dig,n_invdig,which,-1,-1);
  43. }
  44. else{
  45. for(i=1;i<=n;i++){
  46. if(n_col[i]==0 && n_dig[row-i+n]==0 && n_invdig[i+row]==0){
  47. n_col[i]=1;
  48. n_dig[row-i+n]=1;
  49. n_invdig[i+row]=1;
  50. n_position[row]=i;
  51. nqueen(n,row+1,n_position,n_col,n_dig,n_invdig,which,-1,-1);
  52. n_col[i]=0;
  53. n_dig[row-i+n]=0;
  54. n_invdig[i+row]=0;
  55. }
  56. }
  57. }
  58. }
  59. void *parallel(void *k){
  60. struct Posi *get=(struct Posi*)k;
  61. nqueen(get->n,get->x+1,get->p_position,get->p_col,get->p_dig,get->p_invdig,get->thread_id,get->x,get->y);
  62. pthread_exit(NULL);
  63. }
  64. int gotoparallel(int n){
  65. int i,j,k,rc;
  66. struct Posi pos[100];
  67. for(i=1;i<=n;i++){
  68. if(check[i]!=1){
  69. for(j=1;j<=n;j++){
  70. if(col[j]==0 && dig[i-j+n]==0 && invdig[j+i]==0){
  71. for(k=1;k<=2*n;k++){
  72. pos[thread_count].p_col[k]=col[k];
  73. pos[thread_count].p_dig[k]=dig[k];
  74. pos[thread_count].p_invdig[k]=invdig[k];
  75. pos[thread_count].p_position[k]=position[k];
  76. }
  77. pos[thread_count].x=i;
  78. pos[thread_count].y=j;
  79. pos[thread_count].n=n;
  80. pos[thread_count].thread_id=thread_count;
  81. rc=pthread_create(&tid[thread_count],NULL,parallel,(void*)&pos[thread_count]);
  82. if(rc){
  83. printf("ERROR; retrun for pthread_create is %d\n",rc);
  84. exit(-1);
  85. }
  86. /* if(pthread_join(tid[thread_count],NULL)){
  87. perror("pthread_join");
  88. return 1;
  89. }*/
  90. thread_count++;
  91. }
  92. }
  93. break;
  94. }
  95. }
  96. for(i=0;i<thread_count;i++){
  97. if(pthread_join(tid[thread_count],NULL)){
  98. printf("thread join error\n");
  99. }
  100. }
  101. return 0;
  102. }
  103.  
  104. int main (){
  105. int n,m,x,y,i;
  106. thread_count=0;
  107. scanf("%d %d",&n,&m);
  108. for(i=0;i<m;i++){
  109. scanf("%d %d",&x,&y);
  110. x++;
  111. y++;
  112. col[y]=1;
  113. dig[x-y+n]=1;
  114. invdig[y+x]=1;
  115. check[x]=1;
  116. position[x]=y;
  117. }
  118. gotoparallel(n);
  119. printf("count=%d\n",count);
  120. return 0;
  121. }
  122.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘void nqueen(int, int, int*, int*, int*, int*, int, int, int)’:
prog.cpp:18:8: warning: unused variable ‘j’ [-Wunused-variable]
/home/eHPROz/cc0iQdyz.o: In function `gotoparallel(int)':
prog.cpp:(.text+0x2a7): undefined reference to `pthread_join'
prog.cpp:(.text+0x3b8): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
stdout
Standard output is empty