queen.cpp
上传用户:whjcdz88
上传日期:2011-09-07
资源大小:121k
文件大小:3k
源码类别:

图形图象

开发平台:

WINDOWS

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. const int SIZE=30;
  6. int count=0;
  7. int globalflag;
  8. int p[SIZE];
  9. bool check()
  10. {
  11. for(int m=1;m<SIZE;m++)
  12. for(int i=0;i<m;i++)
  13. if(p[i]==p[m]||(abs(p[i]-p[m])==abs(i-m)))
  14. {
  15. printf("<%d,%d>,<%d,%d>n",m,p[m],i,p[i]);
  16. return false;
  17. }
  18. return true;
  19. }
  20. void print()
  21. {
  22. printf("n");
  23. for(int i=0;i<SIZE;i++)
  24. {
  25. printf("t");
  26. for(int j=0;j<SIZE;j++)
  27. {
  28. if(j!=p[i])
  29. printf("0 ");
  30. else
  31. printf("1 ");
  32. }
  33. printf("n");
  34. }
  35. printf("n");
  36. }
  37. void Queen(int m)
  38. {
  39. if(m<SIZE-1&&globalflag==0)
  40. {
  41. if(m!=0)
  42. {
  43. for(int k=0,i=rand()%SIZE;k<SIZE;k++)
  44. {
  45. int flag=0;
  46. for(int j=0;j<m;j++)
  47. if(p[j]==i||abs(p[j]-i)==abs(m-j))
  48. {
  49. flag=1;
  50. break;
  51. }
  52. if(flag==0)
  53. {
  54. p[m]=i;
  55. Queen(m+1);
  56. }
  57. i=(i+1)%SIZE;
  58. }
  59. }
  60. else if(m==0)
  61. {
  62. for(int i=(int)rand()%SIZE,j=0;j<SIZE;j++)
  63. {
  64. p[m]=i;
  65. Queen(m+1);
  66. i=(i+1)%SIZE;
  67. }
  68. }
  69. }
  70. else if(m==(SIZE-1))
  71. {
  72. for(int i=0;i<SIZE;i++)
  73. {
  74. int flag=0;
  75. for(int j=0;j<m;j++)
  76. if(p[j]==i||abs(p[j]-i)==abs(m-j))
  77. {
  78. flag=1;
  79. break;
  80. }
  81. if(flag==0)
  82. {
  83. p[m]=i;
  84. print();
  85. if(check()==false)
  86. printf("simple_errorn");
  87. globalflag=1;
  88. }
  89. if(globalflag==1)
  90. break;
  91. }
  92. }
  93. }
  94. void even_grow(int m,int n,bool flag)
  95. if(flag==0)
  96. {
  97. int x=rand()%SIZE,y=rand()%SIZE;
  98. for(int i=1;i<SIZE;i++)
  99. p[(i*m+x)%SIZE]=(y+n*i)%SIZE;
  100. }
  101. else
  102. {
  103. for(int i=1;i<SIZE+1;i++)
  104. p[(i*m+SIZE)%(SIZE+1)]=(n*i+SIZE)%(SIZE+1);
  105. }
  106. if(check()==false)
  107. printf("m_n_errorn");
  108. print();
  109. }
  110. bool hushu(int m,int n)
  111. {
  112. int flag=0;
  113. for(int i=2;i<=n&&i<=m;i++)
  114. {
  115. if(n%i==0)
  116. {
  117. if(m%i==0)
  118. flag=1;
  119. }
  120. }
  121. if(flag==0)
  122. return true;
  123. return false;
  124. }
  125. void m_n_grow(int &m,int &n,bool global)
  126. {
  127. m=0;n=0;
  128. int size=0,k=0,flag=0,current=2,next=2;
  129. if(global==0)
  130. size=SIZE;
  131. else
  132. size=SIZE+1;
  133. for(int i=2;i<size/2;i++)
  134. {
  135. for(int j=2;j<=sqrt(i);j++)
  136. if(i%j==0)
  137. break;
  138. if(j>sqrt(i)&&hushu(i,size))
  139. {
  140. next=current;
  141. current=i;
  142. if(current!=next&&hushu(abs(current-next),size))
  143. {
  144. n=current;
  145. m=next;
  146. printf("%d ,%dn",m,n);
  147. break;
  148. }
  149. }
  150. }
  151. }
  152. void main()
  153. {
  154. int m=0,n=0;
  155. srand(time(NULL));
  156. globalflag=0;
  157. for(int i=0;i<SIZE;i++)
  158. p[i]=0;
  159. if(SIZE%2==1)
  160. {
  161. m_n_grow(m,n,0);
  162. if(m!=0&&n!=0)
  163. {
  164. printf("even_grown");
  165. even_grow(m,n,0);
  166. printf("even_grown");
  167. }
  168. else
  169. {
  170. printf("simplen");
  171. Queen(0);
  172. printf("simplen");
  173. }
  174. }
  175. else if(SIZE%2==0)
  176. {
  177. m_n_grow(m,n,1);
  178. if(m!=0&&n!=0)
  179. {
  180. printf("odd_grown");
  181. even_grow(m,n,1);
  182. printf("odd_grown");
  183. }
  184. else
  185. {
  186. printf("simplen");
  187. Queen(0);
  188. printf("simplen");
  189. }
  190. }
  191. }
  192.