fork download
  1. // https://u...content-available-to-author-only...r.jp/othello/7gyou.html
  2. // uguisu.skr.jp/othello/7gyou.html
  3.  
  4. #include <stdio.h>
  5.  
  6. // map[90] = {0}
  7. // 盤状態:横9*縦10 y*9+xと使う。0行目と9行目は番兵
  8.  
  9. // dir[]={-10, -9, -8, -1, 1, 8, 9, 10};
  10. // 盤を走査する場合、縦横斜め方向に向かうために足されるべき数
  11. int put, turn, all, done, pass, count, value, i,
  12. map[90] = {0}, dir[]={-10, -9, -8, -1, 1, 8, 9, 10};
  13.  
  14. void check()
  15. {
  16. if (map[put] == 0)
  17. for (i=0; i<8; i++) {
  18. // 8方向走査
  19. // dir[i]の方向の相手のコマの数を確認
  20. for (count = 0, value = put+dir[i];
  21. map[value] == 3-turn; value += dir[i])
  22. count++;
  23.  
  24. if (count && map[value] == turn) {
  25. // 1枚以上存在し、その上端が自分のコマなら
  26. all += count;
  27. value = put;
  28.  
  29. // doneがtrueの場合は、実際にひっくり返す
  30. if (done)
  31. do
  32. map[value] = turn, value += dir[i];
  33. while (map[value] != turn);
  34. }
  35. }
  36. }
  37.  
  38. // mapに対応するオセロ駒&改行
  39. char *h=" - o x\n";
  40.  
  41. int main()
  42. {
  43. // 0:コマ無し
  44. // 1:1player
  45. // 2:2player
  46. // 3:改行
  47. for(i=1, map[41] = map[49] = 2; i<10; map[i++*9] = 3)
  48. map[40] = map[50] = turn = pass = 1;
  49.  
  50. for (;; all = done = 0) { // 毎回allとdoneを初期化
  51. // 盤の表示
  52. for(put = 9; put<82; ++put)
  53. check(), printf("%.2s",&h[map[put]*2]);
  54.  
  55. if(all)
  56. // 1枚でも駒が置けた場合はcomは左上から走査
  57. // 置けた(=allの値が変わった)らturn終了
  58. for(done = all = pass = put = 8; all==8; check())
  59. turn - 2 ? (scanf("%d %d",&put,&i), put+=i*9): ++put;
  60.  
  61. else if(pass)
  62. // 駒は置けない
  63. pass=0,printf("pass");
  64. else
  65. // 両者とも駒を置けないので終了
  66. break;
  67. // turn交代
  68. turn = 3 - turn;
  69. }
  70. return 0;
  71. }
Runtime error #stdin #stdout 0.04s 5276KB
stdin
Standard input is empty
stdout
Standard output is empty