h3mky0's blog

主に競プロについて書きます

AOJ 1249 Make a Sequence(AOJ ICPC 200)

問題リンク
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1249

問題概要
3次元空間でTic-Tac-Toe(マルバツゲーム)を行う。x座標, y座標, z座標のそれぞれの方向ベクトルについてM個以上同じ色が隣接している場合その手を打った色が勝ちとなる。
毎ターンごとにx座標とy座標の情報が与えられるので、勝敗の判定を行う。勝敗が決まらなかった場合、Drawを出力する。



考えたこと
親切にも問題文中に13個の方向ベクトルについて言及されているので, それを実装する。
実際の実装では三次元空間の全ての座標の全ての方向ベクトルについてチェックしたため無駄な処理が多い(コードもかさんでしまい良くない)

先行は白、後手は黒なので勝負が確定した時点で結果を出力する

以下、愚直なコード

#include <bits/stdc++.h>
using namespace std;

#define FOR(i,s,n) for(int i=s;i<(int)n;++i)
#define REP(i,n) FOR(i,0,n)
  
typedef long long ll;

int g[8][8][8];
int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n, m, p;
    while(cin >> n >> m >> p){
        if(n == 0 &&m==0&&p==0) break;

        int c = 0;bool ok = false;
        REP(i,n) REP(j,n) REP(k,n) g[i][j][k] = -1;
        vector<int> X(p), Y(p);
        REP(i,p) cin >> X[i] >> Y[i], X[i]--, Y[i]--;
        REP(i,p){
            
            int x = X[i], y = Y[i];
            for(int j=0; j<n; j++){
                if(g[x][y][j] == -1){
                    g[x][y][j] = c;
                    break;
                }
            }            
            for(int j=0; j<n; j++){
                for(int k=0; k<n; k++){
                    
                    for(int l=0; l<n; l++){
                        int ct = 0;
                        for(int p=0; p<n; p++){
                            if(l-p >= 0 && g[j][k][l-p] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }

                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(l-p >= 0 && g[j][l-p][k] == c){ct++;}
                            else{ ct = 0;}
                            if(ct == m){ ok = true;}
                        }
                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(l-p >= 0 && g[l-p][j][k] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                    }
                }
            }
            for(int j=0; j<n; j++){
                for(int k=0; k<n; k++){
                    for(int l=0; l<n; l++){
                        int ct = 0;
                        for(int p=0; p<n; p++){
                            if(k-p >= 0 && l-p >= 0 && g[j][k-p][l-p] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(j-p >= 0 && k-p >= 0 && g[j-p][k-p][l] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(j-p >= 0 && l-p>=0 && g[j-p][k][l-p] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                        ct=0;
                        for(int p=0; p<n; p++){
                            if(k+p<n && l-p >= 0 && g[j][k+p][l-p] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(j+p<n && k-p >= 0 && g[j+p][k-p][l] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                        ct = 0;
                        for(int p=0; p<n; p++){
                            if(j+p<n && l-p >= 0 && g[j+p][k][l-p] == c){ct++;}
                            else{ct = 0;}
                            if(ct == m){ok = true;}
                        }
                    }
                }
            }

            for(int j=0; j<n; j++){
                for(int k=0; k<n; k++){
                    for(int l=0; l<n; l++){
                        
                        int ct=0;
                        for(int p=0; p<n; p++){
                            if(j+p<n && k+p<n && l+p<n && g[j+p][k+p][l+p] == c){ct++;}
                            else{ct=0;}
                            if(ct==m){ok = true;}
                        }
                        ct=0;
                        for(int p=0; p<n; p++){
                            if(j-p>=0 && k+p<n && l+p<n && g[j-p][k+p][l+p] == c){ct++;}
                            else{ct=0;}
                            if(ct==m){ok = true;}
                        }
                        ct=0;
                        for(int p=0; p<n; p++){
                            if(j+p<n && k-p>=0 && l+p<n && g[j+p][k-p][l+p] == c){ct++;}
                            else{ct=0;}
                            if(ct==m){ok = true;}
                        }
                        ct=0;
                        for(int p=0; p<n; p++){
                            if(j+p<n && k+p<n && l-p>=0 && g[j+p][k+p][l-p] == c){ct++;}
                            else{ct=0;}
                            if(ct==m){ok = true;}
                        }
                    }
                }
            }
            if(ok){
                if(i%2 == 0){
                    cout << "Black " << i+1 << endl;
                }else{
                    cout << "White " << i+1 << endl;
                }
                break;
            }
            c^=1;
        }
        if(!ok){
            cout << "Draw" << endl;
        }
    }
    return 0;
}