fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define N 1000
  5. #define TEMOCHImax 25
  6. // #define CARDTOTAL 100
  7. #define JIJIN 1
  8. #define TEKIJIN 2
  9. #define KIDOKU 4
  10.  
  11. char buf[N], *ku[N];
  12. int status[N];
  13.  
  14. // prototype
  15. int getMaxCard();
  16. int getNumbers(int);
  17.  
  18. int getMaxCard()
  19. {
  20. int i, t, max = 0, maxi = 0;
  21. for (i = 0; ku[i]; ++i) {
  22. if (status[i] == JIJIN) {
  23. t = getNumbers(i);
  24. if (max < t) {
  25. max = t;
  26. maxi = i;
  27. }
  28. }
  29. }
  30. // printf("%d %d %s\n", maxi, max, ku[maxi]);
  31. return maxi;
  32. }
  33.  
  34. int getNumbers(int i)
  35. {
  36. int j, k, r = 0, n;
  37. char dmy[] = " ";
  38.  
  39. n = strlen(dmy);
  40. // printf("n=%d\n", n);
  41. for (j = 0; ku[j]; ++j) {
  42. if (status[j] == TEKIJIN) {
  43. for (k = 0; strncmp(ku[i] + k, ku[j] + k, n) == 0; k += n) {
  44. r++;
  45. // printf("%s %s", ku[i], ku[j]);
  46. }
  47. }
  48.  
  49. }
  50. return r;
  51. }
  52.  
  53. int main()
  54. {
  55. int i, j;
  56. FILE *p = fopen("hyaku.txt", "r");
  57.  
  58. // 1) 百人一首を一行31-32文字のひらがなでテキストファイルとして作っておく。
  59. for (i = 0; fgets(buf, N, p); ++i) {
  60. ku[i] = (char *)malloc(strlen(buf));
  61. strcpy(ku[i], buf);
  62. }
  63. // 2) テキストファイルを読み取り、現在の 自陣(1-25枚) 敵陣(1-25枚)を決める。
  64. i = TEMOCHImax;
  65. printf("\n自陣\n" );
  66. while (i--) {
  67. while (status[j = rand() % 100] & (JIJIN + TEKIJIN));
  68. status[j] = JIJIN;
  69. printf("%s", ku[j]);
  70. }
  71. i = TEMOCHImax;
  72. printf("\n敵陣\n" );
  73. while (i--) {
  74. while (status[j = rand() % 100] & (JIJIN + TEKIJIN));
  75. status[j] = TEKIJIN;
  76. printf("%s", ku[j]);
  77. }
  78. // 3) 既に読まれた札数とその札を決める。
  79. printf("\n既読数 = ");
  80. scanf("%d", &i);
  81. printf("\n以下を既読としました。\n");
  82. while (i--) {
  83. while (status[j = rand() % 100] & (KIDOKU));
  84. status[j] += KIDOKU;
  85. printf("%s", ku[j]);
  86. }
  87. // 4) 設定した状況の元で、自陣の札のうち、敵陣に置かれた時に、敵陣札の中で
  88. //   決まり字に至るまでの間に最も候補札数の多くなる札を選んで返し札とする。
  89. //   ただし最大候補札数の札が複数あった場合は、決まり字の文字数が大きい方、
  90. //   それでも決まらないときは乱数を使って選別することとする。
  91.  
  92. // for (i = 0; ku[i]; ++i) printf("%d", status[i]);
  93.  
  94. printf("\n返し札:\n%s", ku[getMaxCard()]);
  95.  
  96. return 0;
  97. }
  98.  
Runtime error #stdin #stdout 0s 1968KB
stdin
Standard input is empty
stdout
Standard output is empty