PKU : 2361 - Tic Tac Toe
問題概要
http://poj.org/problem?id=2361
三目並べ(Tic Tac Toe)をXのターンから始めたとき, 入力の盤面が途中経過or終了時の盤面として正しいかどうかを判定せよ.
アルゴリズム
次のいずれかの条件を満たしてしまうときはNOと言えます
- Xの数 != Oの数 かつ Xの数 != Oの数+1
- XとOが両方ともそろっている
- Xの数 == Oの数のとき, Xがそろってしまっている
- これを満たすと, Xが揃えたあとにOが書いたことになってしまう
- Xの数 == Oの数+1のとき, Oがそろってしまっている
- Oが揃えたあとに, Xが書いてしまったことになる
プログラム
char t[4][4]; bool win(char ch){ int d1 = 0, d2 = 0; rep(i,3){ int row = 0, col = 0; rep(j,3){ row += (t[i][j] == ch); col += (t[j][i] == ch); } if(row == 3 || col == 3) return true; d1 += (t[i][i] == ch); d2 += (t[i][2-i] == ch); } return d1 == 3 || d2 == 3; } int main(void){ int T; scanf("%d",&T); while(T--){ int X=0,O=0; rep(i,3){ scanf("%s",t[i]); rep(j,3){ if(t[i][j] == 'O') O++; else if(t[i][j] == 'X') X++; } } if(X != O && X != O+1 || win('X') && win('O') || X == O && win('X') || X == O+1 && win('O')){ printf("no\n"); } else{ printf("yes\n"); } } }