基本構造と思われる部分のコードを変えて, 大量の if,while,if の塊を纏めてみました.
環境の都合上テストデータでの数手一括実行です.
何かの参考になりましたら…
c
1#include <stdio.h>
2#include <memory.h>
3
4int field[8][8];
5int canput[8][8]; //下位8ビットでどの方向に「ひっくり返し」が出来るかを示す.
6
7/* 8方向 */
8int di[] = { -1,-1,-1, 0,0, 1,1,1 };
9int dj[] = { -1, 0, 1, -1,1, -1,0,1 };
10
11int check(int target, int ii, int jj, int di, int dj, int value) {
12 for(int i=ii+di, j=jj+dj, otherCount=0; 0<=i && i<8 && 0<=j && j<8; i+=di, j+=dj) {
13 if(field[i][j] == target) return otherCount > 0 ? value : 0; //自石
14 if(field[i][j] == 0) return 0; //空き
15 otherCount ++; //相手石
16 }
17 return 0;
18}
19
20int search(int target) {
21 int count = 0; //置ける場所数
22 for(int i=0; i<8; i++) {
23 for(int j=0; j<8; j++) {
24 canput[i][j] = 0;
25 if(field[i][j] != 0) continue;
26 for(int k=0; k<8; k++) {
27 canput[i][j] |= check(target, i, j, di[k], dj[k], 1<<k);
28 }
29 if(canput[i][j] != 0) count++;
30 }
31 }
32 return count;
33}
34
35void display() {
36 for(int i=0; i<8; i++) {
37 for(int j=0; j<8; j++) {
38 if(field[i][j] == 0) printf(canput[i][j] == 0 ? " _" : " +");
39 if(field[i][j] == 1) printf(" #");
40 if(field[i][j] == 2) printf(" @");
41 }
42 printf("\n");
43 }
44 printf("\n");
45}
46
47void put(int target, int ii, int jj, int di, int dj) {
48 for(int i=ii+di, j=jj+dj; field[i][j]!=target; i+=di, j+=dj) {
49 field[i][j] = target;
50 }
51}
52
53void over(int target, int i, int j) {
54 field[i][j] = target;
55 for(int k=0; k<8; k++) {
56 if(canput[i][j] & 1<<k) put(target, i, j, di[k], dj[k]);
57 }
58}
59
60//テストデータ
61int ti[] = { 2, 2, 5, 5, 3, 2 };
62int tj[] = { 3, 2, 4, 5, 2, 4 };
63
64int main() {
65 memset(field, 0, sizeof(field));
66 field[3][4] = field[4][3] = 1;
67 field[3][3] = field[4][4] = 2;
68
69 int turn = 1; //3との XOR で 1<->2 を繰り返す
70 for(int round=0; round<sizeof(ti)/sizeof(int); round++, turn^=3) {
71 int count = search(turn);
72 display();
73 if(count == 0) printf("pass");
74 else over(turn, ti[round], tj[round]);
75 }
76 int count = search(turn);
77 display();
78
79 return 0;
80}