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; }