fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. struct Core{
  6. int skills[10];//1 to 9,skills[n]= true if core contains skill n
  7. int skillOrder[3];//records the ordering of skills
  8. };
  9. struct SkillOccur {
  10. int skill//which skill
  11. ,occur;//the amount of subjects of this skill
  12. };
  13. void modeOne(struct Core core[], int coreCount, int enumerate,int priority[6]);
  14. void modeTwo(struct Core core[], int coreCount, int enumerate, int priority[6]);
  15. int main() {
  16. /*�ѼƳ]�w��*/
  17. char mode = '1';/*�]�w'1'��4��6�� ,'2'�� 6��9��*/
  18. char enumerate = '2';/*�] '1' �C�X�Ҧ���,�]'2' �C�Ĥ@�զX�G������,�]'3'�C�Ĥ@�ո� */
  19. printf("�w��ϥη����������֤߿z�ᄍ~~\n\n");
  20. /*�Цb�}�C��1����J�z�������֤ߡA�Ψӧ�|�֤��ޡA�H','���j*/
  21. char s1[2000] = "123,143,125,164,136,421,435,415,451,435,431,412,412,432,413,451,652,651,621,615,632,624,623,615,653,523,546,563,562,542,361,352,362,326,356,346,364,324,354,365,264,213,245,236,214";
  22. /*�Цb�}�C��2����J�z�������֤ߡA�Ψӧ䤻�֤E�ޡA�H','���j*/
  23. char s2[2000] =
  24. ",629,647,687,361,317,316,368,386,378,386,328,312,394,359,321,394,387,586,549,546,564,583,518,584,538,539,532,518,572,726,768,719,786,764,783,764,746,783,762,243,257,291,476,426,459,431,468,485,459,462,496,473,439,489,429,436,497";
  25. char *s;
  26. if (mode == '1')s=s1;
  27. else s=s2;
  28. //967841
  29. struct SkillOccur stack[10];
  30. int a, b;
  31. for (a = 0; a < 10; a++) { stack[a].occur = 0; stack[a].skill = a; }
  32. struct Core core[1000];
  33. int coreCount = 0;
  34. char*p=s;
  35. while (1) {
  36.  
  37. if (*p == 0)break;
  38. if (*p == '0' || *(p + 1) == '0') {
  39. stack[*(p + 2) - 48].occur++;
  40. p += 4; continue;
  41. }
  42. else if(*p==',')p++;
  43. for (int i = 0; i < 10; i++) {
  44. core[coreCount].skills[i] = 0;
  45. }
  46. for (int i = 0; i < 3; i++) {
  47. core[coreCount].skillOrder[i] = *(p)-48;
  48. core[coreCount].skills[*(p)-48] = 1;
  49. p++;
  50. }
  51.  
  52. coreCount++;
  53. }
  54. /*data input done*/
  55.  
  56. /*printing cores, recording subject distribution*/
  57.  
  58.  
  59. printf("�C�X�֦����֤�...\n");
  60. for (a = 0; a < coreCount; a++) {
  61.  
  62. printf("�֤߽s��:%d, [ ", a + 1);
  63.  
  64. for (b = 0; b < 3; b++) {
  65. printf("%d ", core[a].skillOrder[b]);
  66. if (b == 2) { stack[core[a].skillOrder[b]].occur += 1; stack[core[a].skillOrder[b]].skill = core[a].skillOrder[b]; }
  67. }
  68. printf("]\n");
  69. }
  70. /*bubblesort the stack*/
  71. struct SkillOccur temp;
  72. for (a = 1; a <= 8; a++) {
  73. for (b = 1; b <= 8 - (a-1); b++) {
  74. if (stack[b].occur > stack[b + 1].occur) {
  75. temp = stack[b+1];
  76. stack[b+1] = stack[b];
  77. stack[b] = temp;
  78. }
  79. }
  80. }
  81. /*�C�X�D���X�{����*/
  82. printf("�C�X�D���X�{����\n");
  83. b = 9;//the top of the sorted stack
  84. for (a = 1; a <= b; a++) printf("�D��%d�X�{%d\n",stack[a].skill,stack[a].occur);
  85. int priority[6];
  86. if (mode == '1')
  87. for (a = 0; a < 4; a++)//we want the top 4 of the stack as priority
  88. priority[a] = stack[b - a].skill;
  89. else for (a = 0; a <6; a++)//we want the top 6 of the stack as priority
  90. priority[a] = stack[b - a].skill;
  91.  
  92. /*search*/
  93. if (mode == '1')modeOne(core, coreCount,enumerate, priority);
  94. else modeTwo(core, coreCount, enumerate, priority);
  95.  
  96.  
  97. return 0;
  98. }
  99. void modeOne(struct Core core[],int coreCount,int enumerate, int priority[6]) {
  100. /*
  101. finding core combinations using brute force loops
  102. */
  103. int selected[7] = { 0 };
  104. int hold[4];
  105. int i, j, k, l,a,b;
  106. printf("start\n");
  107. for (i = 0; i < coreCount; i++) {
  108.  
  109. for (a = 1; a <= 6; a++) {
  110. if (core[i].skills[a])
  111. selected[a] += 1;
  112. }
  113. hold[0] = i;/*selected 1 core*/
  114. for (j = 0; j < coreCount; j++) {
  115. if (j == i)continue;
  116. for (a = 1; a <= 6; a++) {
  117. if (core[j].skills[a])
  118. selected[a] += 1;
  119. }
  120.  
  121. hold[1] = j;//selected 2 cores
  122. for (k = 0; k < coreCount; k++) {
  123. if (k == i || k == j)continue;
  124. int sentinel = 0;
  125. for (a = 1; a <= 6; a++) {
  126. if (core[k].skills[a] && 3 <= selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
  127. {
  128. sentinel = 1; break;
  129. }
  130.  
  131. }
  132. if (sentinel)continue;
  133. for (a = 1; a <= 6; a++) {
  134. if (core[k].skills[a])
  135. selected[a] += 1;
  136. }
  137.  
  138. hold[2] = k;//selected 3 cores
  139. for (l = 0; l < coreCount; l++) {
  140. if (l == i || l == j || l == k)continue;
  141. for (a = 1; a <= 6; a++) {
  142. if (core[l].skills[a])
  143. selected[a] += 1;
  144. }
  145. hold[3] = l;//selected 4 cores, checkpoint
  146. if (selected[1] == 2//checking condition
  147. && selected[2] == 2
  148. && selected[3] == 2
  149. && selected[4] == 2
  150. && selected[5] == 2
  151. && selected[6] == 2
  152. ) {
  153. //printf("\n找到一組4核六技!\n");
  154. int checkDup[4] = { 0,0,0,0 }, dupCount = 0;
  155. for (a = 0; a < 4; a++) {
  156. // printf("核心編號:%d, [ ", hold[a] + 1);
  157. checkDup[dupCount] = core[hold[a]].skillOrder[2];
  158. dupCount++;
  159.  
  160. // printf("]\n\n");
  161.  
  162. }
  163. if (checkDup[0] != checkDup[1] &&
  164. checkDup[0] != checkDup[2] &&
  165. checkDup[0] != checkDup[3] &&
  166. checkDup[1] != checkDup[2] &&
  167. checkDup[1] != checkDup[3] &&
  168. checkDup[2] != checkDup[3]
  169. ) {
  170. int prefered = 0;
  171. /*compare priority and checkdup*/
  172.  
  173. for (a = 0; a < 4; a++)
  174. for (b = 0; b < 4; b++)
  175. if (priority[a] == checkDup[b])
  176. prefered++;
  177. if (prefered == 4)
  178. printf("\n找到一組四核六技!,且它的主詞符合您持有數量前四多的主詞!(%d,%d,%d,%d)\n", priority[0], priority[1], priority[2], priority[3]);
  179. /*else
  180. printf("\n找到一組四核六技!,但它的主詞不符合您持有數量前四多的主詞(%d,%d,%d,%d)", priority[0], priority[1], priority[2], priority[3]);*/
  181.  
  182. if (prefered != 4 && enumerate == '2') {
  183. for (a = 1; a <= 6; a++) {
  184. if (core[l].skills[a])
  185. selected[a] -= 1;
  186. }
  187. continue;
  188. }
  189. printf("\n");
  190.  
  191. for (a = 0; a < 4; a++) {
  192. printf("核心編號:%d, [ ", hold[a] + 1);
  193.  
  194. for (b = 0; b < 3; b++) {
  195.  
  196. printf("%d ", core[hold[a]].skillOrder[b]);
  197.  
  198.  
  199. }
  200. printf("]\n");
  201.  
  202. }
  203.  
  204. if (enumerate == '2'&&prefered == 4) { return; }
  205. else if(enumerate == '3') { return; }
  206. }
  207.  
  208. }
  209. for (a = 1; a <= 6; a++) {
  210. if (core[l].skills[a])
  211. selected[a] -= 1;
  212. }
  213. }
  214. for (a = 1; a <= 6; a++) {
  215. if (core[k].skills[a])
  216. selected[a] -= 1;
  217. }
  218. }
  219. for (a = 1; a <= 6; a++) {
  220. if (core[j].skills[a])
  221. selected[a] -= 1;
  222. }
  223. }
  224. for (a = 1; a <= 6; a++) {
  225. if (core[i].skills[a])
  226. selected[a] -= 1;
  227. }
  228. }
  229. printf("\ndone(若都沒有出現\"找到一組4核六技!\"字樣,表示沒有發現可能的組合,請再多蒐集一些核心!)\n");
  230.  
  231.  
  232. }
  233. void modeTwo(struct Core core[], int coreCount, int enumerate, int priority[6]) {
  234. /*
  235. finding core combinations using brute force loops
  236. */
  237. int selected[10] = { 0 };
  238. int hold[6];
  239. int i, j, k, l,m,n, a, b, sentinel;
  240. printf("start\n");
  241. for (i = 0; i < coreCount; i++) {
  242. for (a = 1; a <= 9; a++) {
  243. if (core[i].skills[a])
  244. selected[a] += 1;
  245. }
  246. hold[0] = i;//selected 1 core
  247. for (j = 0; j < coreCount; j++) {
  248. if (j == i)continue;
  249. for (a = 1; a <= 9; a++) {
  250. if (core[j].skills[a])
  251. selected[a] += 1;
  252. }
  253. hold[1] = j;//selected 2 cores
  254. for (k = 0; k < coreCount; k++) {
  255. if (k == i || k == j)continue;
  256. sentinel = 0;
  257. for (a = 1; a <= 9; a++) {
  258. if (core[k].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
  259. {
  260. sentinel = 1; break;
  261. }
  262.  
  263. }
  264. if (sentinel)continue;
  265. for (a = 1; a <= 9; a++) {
  266. if (core[k].skills[a])
  267. selected[a] += 1;
  268. }
  269.  
  270. hold[2] = k;//selected 3 cores
  271. for (l = 0; l < coreCount; l++) {
  272. if (l == i || l == j||l==k)continue;
  273. sentinel = 0;
  274. for (a = 1; a <= 9; a++) {
  275. if (core[l].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
  276. {
  277. sentinel = 1; break;
  278. }
  279.  
  280. }
  281. if (sentinel)continue;
  282. for (a = 1; a <= 9; a++) {
  283. if (core[l].skills[a])
  284. selected[a] += 1;
  285. }
  286.  
  287. hold[3] = l;//selected 4 cores
  288. for (m = 0; m < coreCount; m++) {
  289. if (m == i || m == j || m == k||m==l)continue;
  290. sentinel = 0;
  291. for (a = 1; a <= 9; a++) {
  292. if (core[m].skills[a] && 3 == selected[a] + 1)/*if 3== selected[a] + 1, then reject subtree*/
  293. {
  294. sentinel = 1; break;
  295. }
  296.  
  297. }
  298. if (sentinel)continue;
  299. for (a = 1; a <= 9; a++) {
  300. if (core[m].skills[a])
  301. selected[a] += 1;
  302. }
  303.  
  304. hold[4] = m;//selected 5 cores
  305. for (n = 0; n < coreCount; n++) {
  306. if (n == i || n == j || n == k||n==l||n==m)continue;
  307. for (a = 1; a <= 9; a++) {
  308. if (core[n].skills[a])
  309. selected[a] += 1;
  310. }
  311. hold[5] = n;//selected 6 cores
  312. if (selected[1] == 2/*final check*/
  313. && selected[2] == 2
  314. && selected[3] == 2
  315. && selected[4] == 2
  316. && selected[5] == 2
  317. && selected[6] == 2
  318. && selected[7] == 2
  319. && selected[8] == 2
  320. && selected[9] == 2
  321. ) {
  322. //printf("\n���@��6��9��!\n");
  323. int checkDup[6] = { 0 }, dupCount = 0;
  324. for (a = 0; a < 6; a++) {
  325. // printf("�֤߽s��:%d, [ ", hold[a] + 1);
  326. checkDup[dupCount] = core[hold[a]].skillOrder[2];
  327. dupCount++;
  328.  
  329. // printf("]\n\n");
  330.  
  331. }
  332. if (checkDup[0] != checkDup[1] &&
  333. checkDup[0] != checkDup[2] &&
  334. checkDup[0] != checkDup[3] &&
  335. checkDup[0] != checkDup[4] &&
  336. checkDup[0] != checkDup[5] &&
  337. checkDup[1] != checkDup[2] &&
  338. checkDup[1] != checkDup[3] &&
  339. checkDup[1] != checkDup[4] &&
  340. checkDup[1] != checkDup[5] &&
  341. checkDup[2] != checkDup[3] &&
  342. checkDup[2] != checkDup[4] &&
  343. checkDup[2] != checkDup[5] &&
  344. checkDup[3] != checkDup[4] &&
  345. checkDup[3] != checkDup[5] &&
  346. checkDup[4] != checkDup[5]
  347. ) {
  348. int prefered = 0;
  349. /*compare priority and checkdup*/
  350.  
  351. for (a = 0; a < 6; a++)
  352. for (b = 0; b < 6; b++)
  353. if (priority[a] == checkDup[b])
  354. prefered++;
  355. if (prefered == 6)
  356. printf("\n���@�դ��֤E��!�A�B�����D���ŦX�z�����ƶq�e���h���D��!\n");
  357. /*else
  358. printf("\n���@�դ��֤E��!�A�������D�����ŦX�z�����ƶq�e�|�h���D��");
  359. printf("[%d,%d,%d,", priority[0], priority[1], priority[2]);
  360. printf("%d,%d,%d]", priority[3], priority[4], priority[5]);*/
  361.  
  362. if (prefered != 6 && enumerate == '2') {/*unselect 6th core*/
  363. for (a = 1; a <= 9; a++) {
  364. if (core[n].skills[a])
  365. selected[a] -= 1;
  366. }
  367. continue;
  368. }
  369. for (a = 0; a < 6; a++) {
  370. printf("�֤߽s��:%d, [ ", hold[a] + 1);
  371.  
  372. for (b = 0; b < 3; b++) {
  373.  
  374. printf("%d ", core[hold[a]].skillOrder[b]);
  375.  
  376.  
  377. }
  378. printf("]\n");
  379.  
  380. }
  381.  
  382. if (enumerate == '2'&&prefered == 6) { return; }
  383. else if (enumerate == '3') { return; }
  384. }
  385. }
  386. for (a = 1; a <= 9; a++) {/*unselect 6th core*/
  387. if (core[n].skills[a])
  388. selected[a] -= 1;
  389. }
  390. }
  391. for (a = 1; a <= 9; a++) {//unselect 5th core
  392. if (core[m].skills[a])
  393. selected[a] -= 1;
  394. }
  395. }
  396. for (a = 1; a <= 9; a++) {/*unselect 4th core*/
  397. if (core[l].skills[a])
  398. selected[a] -= 1;
  399. }
  400. }
  401. for (a = 1; a <= 9; a++) {/*unselect 3rd core*/
  402. if (core[k].skills[a])
  403. selected[a] -= 1;
  404. }
  405.  
  406. }
  407. for (a = 1; a <= 9; a++) {/*unselect 2nd core*/
  408. if (core[j].skills[a])
  409. selected[a] -= 1;
  410. }
  411. }
  412. for (a = 1; a <= 9; a++) {/*unselect 1st core*/
  413. if (core[i].skills[a])
  414. selected[a] -= 1;
  415. }
  416. }
  417. printf("\ndone(若都沒有出現\"找到一組6核9技!\"字樣,表示沒有發現可能的組合,請再多蒐集一些核心!)\n");
  418.  
  419. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
�w��ϥη����������֤߿z�ᄍ~~

�C�X�֦����֤�...
�֤߽s��:1, [ 1 2 3 ]
�֤߽s��:2, [ 1 4 3 ]
�֤߽s��:3, [ 1 2 5 ]
�֤߽s��:4, [ 1 6 4 ]
�֤߽s��:5, [ 1 3 6 ]
�֤߽s��:6, [ 4 2 1 ]
�֤߽s��:7, [ 4 3 5 ]
�֤߽s��:8, [ 4 1 5 ]
�֤߽s��:9, [ 4 5 1 ]
�֤߽s��:10, [ 4 3 5 ]
�֤߽s��:11, [ 4 3 1 ]
�֤߽s��:12, [ 4 1 2 ]
�֤߽s��:13, [ 4 1 2 ]
�֤߽s��:14, [ 4 3 2 ]
�֤߽s��:15, [ 4 1 3 ]
�֤߽s��:16, [ 4 5 1 ]
�֤߽s��:17, [ 6 5 2 ]
�֤߽s��:18, [ 6 5 1 ]
�֤߽s��:19, [ 6 2 1 ]
�֤߽s��:20, [ 6 1 5 ]
�֤߽s��:21, [ 6 3 2 ]
�֤߽s��:22, [ 6 2 4 ]
�֤߽s��:23, [ 6 2 3 ]
�֤߽s��:24, [ 6 1 5 ]
�֤߽s��:25, [ 6 5 3 ]
�֤߽s��:26, [ 5 2 3 ]
�֤߽s��:27, [ 5 4 6 ]
�֤߽s��:28, [ 5 6 3 ]
�֤߽s��:29, [ 5 6 2 ]
�֤߽s��:30, [ 5 4 2 ]
�֤߽s��:31, [ 3 6 1 ]
�֤߽s��:32, [ 3 5 2 ]
�֤߽s��:33, [ 3 6 2 ]
�֤߽s��:34, [ 3 2 6 ]
�֤߽s��:35, [ 3 5 6 ]
�֤߽s��:36, [ 3 4 6 ]
�֤߽s��:37, [ 3 6 4 ]
�֤߽s��:38, [ 3 2 4 ]
�֤߽s��:39, [ 3 5 4 ]
�֤߽s��:40, [ 3 6 5 ]
�֤߽s��:41, [ 2 6 4 ]
�֤߽s��:42, [ 2 1 3 ]
�֤߽s��:43, [ 2 4 5 ]
�֤߽s��:44, [ 2 3 6 ]
�֤߽s��:45, [ 2 1 4 ]
�C�X�D���X�{����
�D��7�X�{0
�D��8�X�{0
�D��9�X�{0
�D��6�X�{6
�D��1�X�{7
�D��4�X�{7
�D��3�X�{8
�D��5�X�{8
�D��2�X�{9
start

找到一組四核六技!,且它的主詞符合您持有數量前四多的主詞!(2,5,3,4)

核心編號:1, [ 1 2 3 ]
核心編號:4, [ 1 6 4 ]
核心編號:7, [ 4 3 5 ]
核心編號:17, [ 6 5 2 ]