Problem:
三目並べ

3 × 3 の盤面の三目並べを考えましょう。三目並べは 2 人で行う対戦ゲームです。先攻後攻を決め、一人は黒石、一人は白石を打ちます。盤面に石を交互に一つずつ置いていき、縦横斜めのいずれかの方向に先に 3 つ自分の石を並べた人が勝ちとなります。

盤面の情報を入力とし、勝敗の判定を行い、黒が勝ちの場合は「b」、白が勝ちの場合は「w」、どちらもそろっていない場合は「NA」と出力するプログラムを作成してください。 盤面の情報は、3行3列の文字列で構成されます。「b」は黒石、「w」は白石、「+」(半角プラ
ス)は何も置かれていない状況を表します。ただし、同時に黒が3つ、白が3つ並ぶことはありませ
ん。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットは以下の形式で与えられます。

board1
board2
board3

i 行目に盤面の i 行目の情報を表す文字列 boardi が与えられます。

データセットの数は 50 を超えません。

Output

データセット毎に、「b」、「w」、「NA」のいずれかを１行に出力します。

Sample Input

bbw
wbw
+b+
bwb
wbw
wbw
0

Output for the Sample Input

b
NA

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class Main{

	Scanner sc=new Scanner(System.in);

	int INF=1<<28;
	double EPS=1e-9;

	int[][] a;
	int n;

	void run(){
		n=3;
		for(;;){
			a=new int[n][n];
			for(int j=0; j<n; j++){
				String s=sc.next();
				if(s.equals("0")){
					return;
				}
				for(int i=0; i<n; i++){
					switch(s.charAt(i)){
					case 'b':
						a[j][i]=0;
						break;
					case 'w':
						a[j][i]=1;
						break;
					case '+':
						a[j][i]=-1;
						break;
					}
				}
			}
			solve();
		}
	}

	void solve(){
		if(check(0)){
			println("b");
		}else if(check(1)){
			println("w");
		}else{
			println("NA");
		}
	}

	boolean check(int e){
		boolean f=false;
		for(int j=0; j<n; j++){
			boolean f1=true, f2=true;
			for(int i=0; i<n; i++){
				f1&=a[j][i]==e;
				f2&=a[i][j]==e;
			}
			f|=f1|f2;
		}
		boolean f1=true, f2=true;
		for(int i=0; i<n; i++){
			f1&=a[i][i]==e;
			f2&=a[i][n-1-i]==e;
		}
		return f|f1|f2;
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}

	void print(String s){
		System.out.print(s);
	}

	void println(String s){
		System.out.println(s);
	}

	public static void main(String[] args){
		// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
		new Main().run();
	}
}